上一節我們講了《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」。