本文繼@Spring Cloud | NO.1 - 服務的註冊與發現 [Eureka],上一篇已經開啓了一個服務註冊中心並已註冊服務提供者的服務到註冊中心,本章主要講如何調用註冊中心的服務。html
在SpringCloud微服務架構中,服務與服務之間的通訊基於
HTTP RESTFUL
。
Ribbon是一個客戶端負載均衡器,它能夠很好地控制HTTP和TCP客戶端的行爲。Ribbon中的中心概念是指定客戶端的概念。每一個負載平衡器是組合的組合的一部分,它們一塊兒工做以根據須要聯繫遠程服務器,而且集合具備您將其做爲應用程序開發人員(例如使用@FeignClient註釋)的名稱。
——官方直譯
1. pom.xml
引入Maven依賴java
<parent> <!-- spring boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <!-- netflix-eureka-client--> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <!-- netflix-ribbon --> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- spring cloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注意:
Ribbon
引入的Maven依賴中artifactId
有變更,SpringBoot2.0以前
的版本爲spring-cloud-starter-ribbon
2. 添加註解支持web
@SpringBootApplication @EnableDiscoveryClient public class RibbonServiceApplication { public static void main(String[] args) { SpringApplication.run(RibbonServiceApplication .class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
經過@EnableDiscoveryClient
向服務中心註冊
經過@Bean
注入一個RestTemplate Bean
,並經過@LoadBalanced
註解代表這個restRemplate
開啓負載均衡的功能
3. application.yml
配置spring
spring: application: name: service-ribbon server: port: 8764 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
將名稱爲service-ribbon
的服務註冊到註冊中心,端口爲8764
4. 服務調用segmentfault
@Service public class HelloService { @Autowired RestTemplate restTemplate; public String hiService(String name) { return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class); } }
與正常的RestTemplate
調用服務不一樣的是將請求服務的url
替換成了具體的服務名稱
,也就是註冊在註冊中心的服務名稱,若是相同的服務名稱在註冊中心存在不一樣端口的註冊,那麼在這裏會作客戶端的負載均衡。
至此Ribbon的配置完畢。瀏覽器
此時,咱們寫一個Controller來展現服務調用的結果。服務器
@RestController public class HelloControler { @Autowired HelloService helloService; @RequestMapping(value = "/hi") public String hi(@RequestParam String name){ return helloService.hiService(name); } }
4. 運行概覽圖antd
啓動一個服務註冊中心,兩個服務提供者,一個服務消費者(Ribbon)
屢次訪問 http://127.0.0.1:8764/hi?name...,瀏覽器交替顯示:架構
hi forezp,i am from port:8762
hi forezp,i am from port:8763
Feign是一個聲明式的Web服務客戶端。這使得Web服務客戶端的寫入更加方便 要使用Feign建立一個界面並對其進行註釋。它具備可插入註釋支持,包括Feign註釋和JAX-RS註釋。Feign還支持可插拔編碼器和解碼器。Spring Cloud增長了對Spring MVC註釋的支持,並使用Spring Web中默認使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign時提供負載均衡的http客戶端。
——官方直譯
1. pom.xml
引入Maven依賴app
<parent> <!-- spring boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <!-- netflix-eureka-client--> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- spring cloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注意:
Feign
引入的Maven依賴中artifactId
有變更,SpringBoot2.0以前
的版本爲spring-cloud-starter-feign
2. 添加註解支持
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class FeignServiceApplication { public static void main(String[] args) { SpringApplication.run(FeignServiceApplication.class, args); } }
經過@EnableDiscoveryClient
向服務中心註冊
經過@EnableFeignClients
註解開啓Feign的功能
3. application.yml
配置
spring: application: name: service-feign server: port: 8765 cage: feign-client: base-packages: ltd.ueic,ltd.ueic.cages eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
將名稱爲service-feign
的服務註冊到註冊中心,端口爲8765
4. 服務調用
定義一個接口來調用服務
@FeignClient(value = "service-hi") public interface SchedualServiceHi { @RequestMapping(value = "/hi",method = RequestMethod.GET) String sayHiFromClientOne(@RequestParam(value = "name") String name); }
經過@FeignClient
制定調用的服務名稱
經過在接口上聲明@RequestMapping
指明調用服務的接口地址
至此Feign的配置完畢。
此時,咱們寫一個Controller來展現服務調用的結果。
@RestController public class HiController { @Autowired SchedualServiceHi schedualServiceHi; @RequestMapping(value = "/hi",method = RequestMethod.GET) public String sayHi(@RequestParam String name){ return schedualServiceHi.sayHiFromClientOne(name); } }
4. 運行概覽圖
啓動一個服務註冊中心,兩個服務提供者,一個服務消費者(Ribbon),一個服務消費者(Feign)
屢次訪問 http://localhost:8765/hi?name...,瀏覽器交替顯示:
hi forezp,i am from port:8762
hi forezp,i am from port:8763