參考《spring cloud 微服務實戰》
現在已經構建了服務注冊中心和服務提供中心,下面就來構建服務消費者:
服務消費者主要完成:發現服務和消費服務。其中服務的發現主要由Eureka的客戶端完成,而消費的任務由Ribbon完成。
Ribbon是一個基於HTTP和TCP的客戶端負載均衡器,它可以通過客戶端中配置ribbonServerList服務端列表去輪詢訪問
以達到負載均衡的作用。當Ribbon和Eureka聯合使用時,Ribbon的服務實例清單RibbonServerList會被DiscoveryEnabledNIWSServerList
重寫,擴展成從Eureka注冊中心獲取服務端列表。同時它也會用NIWSDiscoveryPing來取代Ping,通過Eureka來確定服務端是否已經啟動。
首先,啟動eureka-server和eureka-client服務,為了實現Ribbon客戶端負載均衡功能,我們通過java -jar 命令行的方式來啟動兩個不同
端口的eureka-client:
java -jar eureka-client-0.0.1-SNAPSHOT.jar --server.port=2001 java -jar eureka-client-0.0.1-SNAPSHOT.jar --server.port=2002
成功啟動 eureka-client 服務之后,可以在注冊中心看到對應的服務信息。
創建服務消費工程
創建一個Spring Boot基礎工程來ribbon-consumer來實現服務消費者,並在pom.xml文件中新增Ribbon模塊依賴:spring-cloud-starter-ribbon
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>ribbon-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>ribbon-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.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>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
主類應用中,通過@EnableDiscoveryClient注解讓改應用注冊為Eureka客戶端應用,以獲得服務發現的能力。同時,在該主類中創建RestTemplate的Spring Bean實例,
並通過@LoadBalanced注解開啟客戶端負載均衡。
@EnableDiscoveryClient @SpringBootApplication public class RibbonConsumerApplication { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonConsumerApplication.class, args); } }
創建ConsumerController類並實現/ribbon-consumer接口。在該接口中,通過在上面創建的RestTemplate來實現對EUREKA-CLIENT服務提供的/dc 接口調用。
這里訪問的地址是服務名:EUREKA-CLIENT,而不是一個IP地址。
@RestController public class ConsumerController { @Autowired RestTemplate restTemplate; @RequestMapping(value="/ribbon-consumer",method=RequestMethod.GET) public String helloConsumer() { return restTemplate.getForEntity("http://EUREKA-CLIENT/dc", String.class).getBody(); } }
配置application.properties文件
spring.application.name=ribbon-consumer server.port=3001 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
通過訪問http://localhost:3001/ribbon-consumer發起GET請求,成功返回信息,通過日志可以看到Ribbon對客戶端進行了輪詢訪問,
實現了負載均衡。