SpringBoot+SpringCloud+vue+Element開發專案——服務消費(Ribbon、Feign)
一、服務提供者
1、新建一個專案jansens-producer、新增依賴
- Swagger:API文件。
- Consul:註冊中心。
- Spring Boot Admin:服務監控。
pom.xml
<properties> <swagger.version>2.9.2</swagger.version> <spring.boot.admin.version>2.0.4</spring.boot.admin.version> </properties> <!-- web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- swagger --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> <!--spring-boot-admin--> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>${spring.boot.admin.version}</version> </dependency> <!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
2、配置檔案
application.yml
server: port: 8003 spring: application: name: jansens-producer cloud: consul: host: localhost port: 8500 discovery: serviceName: ${spring.application.name} # 註冊到consul的服務名稱 boot: admin: client: url: "http://localhost:8000" # 開放健康檢查介面 management: endpoints: web: exposure: include:"*" endpoint: health: show-details: ALWAYS
3、啟動類
JansensProducerApplication.java
@EnableDiscoveryClient @SpringBootApplication public class JansensProducerApplication { public static void main(String[] args){ SpringApplication.run(JansensProducerApplication.class,args); } }
4、自定義Banner
banner.txt
//////////////////////////////////////////////////////////////////// // _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/`---'\____ // // .' \\| |// `. // // / \\||| : |||// \ // // / _||||| -:- |||||- \ // // | | \\\ - /// | | // // | \_| ''\---/'' | | // // \ .-\__ `-` ___/-. / // // ___`. .' /--.--\ `. . ___ // // ."" '< `.___\_<|>_/___.' >'"". // // | | : `- \`.;`\ _ /`;.`/ - ` : | | // // \ \ `-. \_ __\ /__ _/ .-` / / // // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 上海研發 永無BUG // ////////////////////////////////////////////////////////////////////
5、新增控制器
HelloController.java
@RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello Jansens!"; } }
注意:為了模擬負載均衡,複製一份上面的專案取名為jansens-producer2,修改埠為8004,修改hello方法返回值為hello Jansens 2。依次啟動註冊中心、服務監控和兩個服務提供者。依次訪問http://localhost:8003/hello和http://localhost:8004/hello
二、服務消費者
1、新建一個專案jansens-consumer、新增依賴。
- Swagger:API文件。
- Consul:註冊中心。
- Spring Boot Admin:服務監控。
pom.xml
<properties> <swagger.version>2.9.2</swagger.version> <spring.boot.admin.version>2.0.4</spring.boot.admin.version> </properties> <!-- web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- swagger --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> <!--spring-boot-admin--> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>${spring.boot.admin.version}</version> </dependency> <!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
2、新增配置
application.yml
server: port: 8005 spring: application: name: jansens-consumer cloud: consul: host: localhost port: 8500 discovery: serviceName: ${spring.application.name} # 註冊到consul的服務名稱 boot: admin: client: url: "http://localhost:8000" # 開放健康檢查介面 management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS
3、啟動類
JansensConsumerApplication.java
@EnableDiscoveryClient @SpringBootApplication public class JansensConsumerApplication { public static void main(String[] args){ SpringApplication.run(JansensConsumerApplication.class,args); } }
4、服務消費
新增消費服務測試類,新增兩個介面,一個查詢所有我們註冊的服務,另一個從我們註冊的服務中選取一個服務,採取輪詢的方式。
ServiceController.java
@RestController public class ServiceController { @Autowired private LoadBalancerClient loadBalancerClient; @Autowired private DiscoveryClient discoveryClient; /** * 獲取所有服務 */ @RequestMapping("/services") public Object services() { return discoveryClient.getInstances("jansens-producer"); } /** * 從所有服務中選擇一個服務(輪詢) */ @RequestMapping("/discover") public Object discover() { return loadBalancerClient.choose("jansens-producer").getUri().toString(); } }
訪問http://localhost:8005/services、返回兩個服務,分別是註冊的8003、8004。反覆訪問http://localhost:8005/discover,結果交替的返回服務8003和8004,因為預設的負載均衡器採用的是輪詢的方式,兩個交替出現,從而實現了獲取服務端地址的均衡負載。
CallHelloController.java
@RestController public class CallHelloController { @Autowired private LoadBalancerClient loadBalancer; @RequestMapping("/call") public String call() { ServiceInstance serviceInstance = loadBalancer.choose("jansens-producer"); System.out.println("服務地址:" + serviceInstance.getUri()); System.out.println("服務名稱:" + serviceInstance.getServiceId()); String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class); System.out.println(callServiceResult); return callServiceResult; } }
使用RestTemplate進行遠端呼叫。
5、負載均衡器(Ribbon)
修改啟動類注入RestTemplate並新增@LoadBalanced註解(用於攔截請求),以使用Ribbon來進行負載均衡。
JansensConsumerApplication.java
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
6、新增服務
RibbonHelloController.java
@RestController public class RibbonHelloController { @Autowired private RestTemplate restTemplate; @RequestMapping("/ribbon/call") public String call() { // 呼叫服務, service-producer為註冊的服務名稱,LoadBalancerInterceptor會攔截呼叫並根據服務名找到對應的服務 String callServiceResult = restTemplate.getForObject("http://jansens-producer/hello", String.class); return callServiceResult; } }
啟動消費者服務,訪問http://localhost:8005/ribbon/call
三、服務消費(Feign)
1、修改jansens-consumer的pom檔案,新增feign依賴
pom.xml
<!--feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.0.1.RELEASE</version> </dependency>
2、修改啟動類,新增@EnableFeignClients註解,開啟掃描Spring Cloud Feign客戶端的功能。
@EnableFeignClients @EnableDiscoveryClient @SpringBootApplication public class JansensConsumerApplication { public static void main(String[] args){ SpringApplication.run(JansensConsumerApplication.class,args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }