Spring Cloud 微服務入門教程(三):微服務的註冊

2020-11-12 任霏

上一節我們講了《Spring Cloud 微服務入門教程(二):服務註冊與發現-Eureka》搭建了微服務的註冊發現中心,這一節我們就講一下如何新建一個微服務服務並且將服務註冊到註冊中心。

統一接口中心模塊

在開始之前我先說明一下「統一接口中心」並不是微服務的標準架構,這個是我自己設計的架構,因為我覺得整個架構裡會很多服務,服務之間要相互調用,而且團隊合作中可能有很多人很多團隊來寫各自的服務模塊,如果不規定好都有什麼請求地址,什麼樣的請求對象和返回對象,就很難高效的協同,所以我會提前寫好interface接口,定義好controller請求的地址、Request的結構、Result的結構,這樣負責實現的服務的團隊只需要實現interface接口就可以了,其他人調用的時候也之前要傳什麼類型的Request,收到什麼樣的Result。最後再次聲明,統一接口中心是我自己設計的架構,並不包含在微服務體系裡,僅供各位參考,可能並不適合你的業務形態,需要你自己設計,我只提供思路教程。

右擊根項目名,新建一個模塊叫api-center的maven子項目,就像上一節新建eureka模塊那樣,不再贅述,這裡還需要新增一個依賴spring-boot-starter-web,因為這樣可以把請求的URL地址也提前定義好,新建完成以後的POM文件是:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud</artifactId> <groupId>net.renfei</groupId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>net.renfei</groupId> <artifactId>apicenter</artifactId> <version>1.0.0</version> <name>APICenter</name> <description>接口中心</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>

然後在api-center子項目的src/main/java中新建三個包:net.renfei.apicenter.service、net.renfei.apicenter.request、net.renfei.apicenter.result,在request這個包下新建一個class叫BaseRquest,作為請求體的基類並且實現Serializable序列化接口,再新建一個叫DemoRquest的類繼承BaseRquest,裡面有個成員欄位String msg:

package net.renfei.apicenter.request;public class DemoRquest extends BaseRquest implements Serializable { private static final long serialVersionUID = 1L; private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; }}

在net.renfei.apicenter.result包下我們新建一個Result類,這將來是我們統一的返回格式:

package net.renfei.apicenter.result;import java.io.Serializable;public class Result implements Serializable { private static final long serialVersionUID = 1L; private int code; private String message; private Object object; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getObject() { return object; } public void setObject(Object object) { this.object = object; }}

然後我們在net.renfei.apicenter.service包下新建一個interface叫DemoService的接口:

package net.renfei.apicenter.service;import net.renfei.apicenter.request.DemoRquest;import net.renfei.apicenter.result.Result;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;public interface DemoService { @GetMapping("/") Result index(); @PostMapping("/sayMsg") Result sayMsg(DemoRquest demoRquest);}

這樣通過interface約定好了服務的地址、服務的名稱、請求的類型和返回額類型,這就是DemoService的接口。

新建一個服務生產者

右擊項目根目錄,新建一個名為 demoservice 的空白maven項目,作為服務的提供者,並修改POM文件,這裡依賴spring-cloud-starter-netflix-eureka-client、spring-boot-starter-web和apicenter模塊:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud</artifactId> <groupId>net.renfei</groupId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>net.renfei</groupId> <artifactId>demoservice</artifactId> <version>1.0.0</version> <name>demo-service</name> <description>演示服務</description> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>net.renfei</groupId> <artifactId>apicenter</artifactId> <version>1.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

然後新建包名:net.renfei.demoservice.controller,在resources中新建application.yml文件:

server: port: 18080spring: application: name: DemoServiceeureka: client: service-url: defaultZone: http://localhost:8761/eureka/

application.yml裡設置了啟動的埠、應用的名稱和eureka的註冊中心地址,其中http://localhost:8761/eureka/就是我們eureka註冊中心的地址,見《Spring Cloud 微服務入門教程(二):服務註冊與發現-Eureka》的配置過程。

在net.renfei.demoservice.controller包下新增一個DemoController並實現DemoService:

package net.renfei.demoservice.controller;import net.renfei.apicenter.request.DemoRquest;import net.renfei.apicenter.result.Result;import net.renfei.apicenter.service.DemoService;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class DemoController implements DemoService { @Override public Result index() { Result result = new Result(); result.setCode(200); result.setMessage("You're visiting DemoService."); return result; } @Override public Result sayMsg(@RequestBody DemoRquest demoRquest) { Result result = new Result(); result.setCode(200); result.setMessage("This is DemoService, Your Mag is: " + demoRquest.getMsg()); return result; }}

然後在net.renfei.demoservice包下新建一個DemoServiceApplication類作為模塊的啟動入口類

package net.renfei.demoservice;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@EnableEurekaClient@SpringBootApplicationpublic class DemoServiceApplication { public static void main(String[] args) { SpringApplication.run(DemoServiceApplication.class, args); }}

與SpringBoot不同的是,新增了一個@EnableEurekaClient註解,這個就是Eureka的客戶端,會向Eureka註冊中心註冊自己,到這裡一個服務就完成了。

運行微服務註冊

至此,微服務的註冊發現就完成了,先啟動eureka,然後啟動demoservice,我們來測試一下吧。全部啟動以後,並訪問我們配置的eureka地址,這個就是註冊中心,可以打開就是成功了,我這裡的案例是:localhost:8761


可以看到「Instances currently registered with Eureka」中已經發現了一個服務,「DEMOSERVICE」。

相關焦點

  • Spring Cloud 微服務入門教程(七):Spring Cloud Stream
    上一節的《Spring Cloud 微服務入門教程(六):Spring Cloud BUS 消息總線實現配置中心動態更新配置文件》已經安裝了RabbitMQ消息隊列,並實現了SpringCloudBus消息總線,本節介紹Spring Cloud Stream 消息隊驅動式的微服務。可以使用RabbitMQ、Apache Kafka等,用於微服務之間的異步消息傳遞和接收。
  • Spring Cloud 微服務入門教程(四):微服務間調用-FeignClient
    上一節《Spring Cloud 微服務入門教程(三):微服務的註冊》我們講了服務的註冊,本節我們講服務之間的調用,也就是作為服務消費者去消費其他服務,以及使用FeignClient來快速高效的調用其他服務。
  • Spring Cloud 微服務入門教程(五):統一配置中心ConfigService
    上一節《Spring Cloud 微服務入門教程(四):微服務間的調用消費-FeignClient》我們講了微服務的新建和服務間的調用消費,隨著微服務的增多,那麼多SpringBoot程序,修改他們的配置文件會是很恐怖的工作量,所以微服務架構中還為我們提供了配置中心,這樣可以方便統一的管理我們的服務配置文件,同時線上生產環境的配置是不對開發人員開放的,這樣只需要運維人員維護線上的配置中心即可。
  • Spring Cloud 微服務入門教程(六):Spring Cloud BUS 消息總線
    上一節我們講了《Spring Cloud 微服務入門教程(五):統一配置中心-ConfigService》實現了統一管理配置,在文末我也說了依賴重啟才能自動拉取配置,所以本章節就講一下利用Spring Cloud BUS 消息總線來自動更新配置文件,這將實現應用無需重啟就可以熱更新配置文件。
  • Spring Cloud 微服務入門教程(一):微服務介紹
    前言我的個人博客網站一直堅持每年一次大更新,但這次我決定不更新了,因為再更新就是使用微服務了,一個小網站用微服務架構就有點殺雞用牛刀了,而且維護起來比較費時費力。所以直接寫成教程文章就不再大動幹戈的去重寫我的博客了。
  • Spring Cloud 微服務入門教程(二):服務註冊與發現-Eureka
    使用Maven構建多模塊項目使用IntellJ IDEA新建一個Maven項目,JDK使用1.8,我比較喜歡手動操作,所以先新建一個空的Maven項目,groupId是net.renfei,artifactId是cloud,version是1.0.0,這三個就使用你自己的公司名字和項目名就可以:
  • SpringCloud微服務架構實戰:微服務治理
    -d ata-d 表示指定數據的存放目錄(該目錄必須存在)。因而在一個註冊中心中,微服務的名稱必須具有唯一性。斷路器儀錶盤是Spring Cloud工具套件中的一一個組件,為了使用這個功能組件,我們需要引用如下所示的工具包:<dependenc s><dependency><groupid>org .springframework.cloud</groupid><artifactid>spring- cloud
  • 微服務實戰系列(六)-網關springcloud zuul
    場景描述今天接著介紹springcloud,今天介紹下springcloud的路由網關-Zuul,外圍系統或者用戶通過網關訪問服務,網關通過註冊中心找到對應提供服務的客戶端,網關也需要到註冊中心進行註冊。
  • Spring Cloud Alibaba 微服務商城系統
    mall-cloud-alibaba微服務學習教程Spring Cloud Alibaba (Nacos,Sentinel,Feign,Gateway,RabbitMQ,Ribbon等)微服務教程項目介紹mall-cloud-alibaba 是一套基於開源商城 mall 改造的 spring cloud alibaba 體系微服務商城系統。
  • Spring Cloud:微服務入門,案例準備
    服務註冊:服務提供者將所提供服務的信息(伺服器 IP 和埠、服務訪問協議等)註冊 / 登記到註冊中心。服務發現:服務消費者能夠從註冊中心獲取到較為實時的服務列表,然後根究一定的策略選擇一個服務訪問。服務消費者啟動時,需要將自己註冊到服務註冊中心。​
  • 從零開始,輕鬆搞定SpringCloud微服務系列-註冊中心
    微服務體系,有效解決項目龐大、互相依賴的問題。目前SpringCloud體系有強大的一整套針對微服務的解決方案。本文中,重點對微服務體系中的服務發現註冊中心進行詳細說明。本篇中的註冊中心,採用Netflix 公司的Eureka。
  • 微服務網關Spring Cloud Gateway全搞定
    spring-cloud-gateway, 是spring 出品的 基於spring 的網關項目,集成斷路器,路徑重寫,性能比Zuul好。我們使用gateway這個網關技術,無縫銜接到基於spring cloud的微服務開發中來。1.3 微服務為什麼要使用網關呢?
  • 容器微服務和持續集成,(一)Spring cloud搭建部署
    從今天開始,我會以多個篇幅,詳細介紹和整理容器微服務和持續集成,主要通過Spring Cloud微服務改造、容器化部署和Jenkins持續集成,完成基本的微服務架構實現。微服務採用Spring Cloud,平臺架構採用Docker、Devops採用GitLab、Jenkins。爭取寫清楚,講明白。希望能幫助到有需要的朋友們。第一篇,就從Spring cloud開始。
  • 微服務系列之Nacos註冊中心(一)
    註冊中心可以說是微服務架構中的「通訊錄」,它記錄了服務和服務地址的映射關係。在分布式架構中,服務會註冊到這裡,當服務需要調用其它服務時,就到這裡找到服務的地址,進行調用。  簡單理解就是:在沒有註冊中心時候,服務間調用需要知道被當服務調方的具體地址(寫死的 ip:port)。更換部署地址,就不得不修改調用當中指定的地址。
  • 如何用Spring Boot和Cloud實現微服務
    有關如何使用Spring Cloud來構建Gateway的內容,請訪問https://spring.io/projects/spring-cloud-gateway。如果您想了解更多有關如何使用Spring Cloud,來輕鬆創建Config Server的詳細內容,請參見--https://spring.io/projects/spring-cloud-config。
  • 深度解析springcloud分布式微服務的實現
    微服務和分布式就是作用的「目標不一樣」。微服務與Cloud微服務是一種概念,spring-cloud是微服務的實現。微服務也不一定必須使用cloud來實現,只是微服務中有許多問題,如:負載均衡、服務註冊與發現、路由等等。而cloud則是將這些處理問題的技術整合了。
  • 深度解析spring cloud分布式微服務的實現
    微服務和分布式就是作用的「目標不一樣」。微服務與Cloud微服務是一種概念,spring-cloud是微服務的實現。微服務也不一定必須使用cloud來實現,只是微服務中有許多問題,如:負載均衡、服務註冊與發現、路由等等。而cloud則是將這些處理問題的技術整合了。
  • Spring cloud系列教程第十篇- Spring cloud整合Eureka總結篇
    Spring cloud系列教程第十篇- Spring cloud整合Eureka總結篇本文主要內容:1:spring cloud整合Eureka總結本文是由凱哥(凱哥Java:kagejava)發布的《spring cloud系列》教程的總第十篇:本文是幾個維度中的第一個維度:註冊與發現維度配置中心管理之Eureka相關教程第七篇-Spring
  • 資深架構師解析springcloud分布式微服務的實現
    微服務和分布式就是作用的「目標不一樣」。微服務與Cloud微服務是一種概念,spring-cloud是微服務的實現。微服務也不一定必須使用cloud來實現,只是微服務中有許多問題,如:負載均衡、服務註冊與發現、路由等等。而cloud則是將這些處理問題的技術整合了。
  • Rancher部署Spring Cloud微服務(初探)
    一 、 安裝docker安裝rancher依賴docker環境,k8s節點也依賴docker環境,可以自行安裝,沒有安裝過的可以參考網上的教程。2.4 查看頁面初始頁面要設置密碼三、controlplane --worker四、 部署spring