Ribbon
Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。
当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。
同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。
操作:
再起一台服务,修改端口
此时在看注册中心
使用Ribbon实现客户端负载均衡的消费者
构建一个基本Spring Boot项目,并在pom.xml中加入如下内容:
<?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.clc</groupId> <artifactId>clc-client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>registry</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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>Brixton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
在应用主类中,通过@EnableDiscoveryClient
注解来添加发现服务能力。创建RestTemplate实例,并通过@LoadBalanced
注解开启均衡负载能力。
@EnableDiscoveryClient @SpringBootApplication public class ClientApplication { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ClientApplication.class, args); } }
创建ConsumerController
来消费COMPUTE-SERVICE
的add服务。通过直接RestTemplate来调用服务,计算10 + 20的值。
package com.clc.client.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class ConsumerController { @Autowired RestTemplate restTemplate; @RequestMapping(value = "/add", method = RequestMethod.GET) public String add() { return restTemplate.getForEntity("http://clc-service/add?a=10&b=20", String.class).getBody(); } }
application.properties
中配置eureka服务注册中心
#服务名 spring.application.name=clc-client server.port=9004 #注册中心地址 eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
启动该应用,并访问两次:http://localhost:9004/add
然后,打开clc-service的两个服务提供方,分别输出了类似下面的日志内容:
- 端口为9002服务提供端的日志:
2018-08-31 15:40:39.766 INFO 4758 --- [io-9002-exec-10] c.c.s.c.ComputeController@7c1c5936 : /add, host:192.168.43.85, service_id:clc-service结果:2
- 端口为9003服务提供端的日志:
2018-08-31 15:40:45.278 INFO 4802 --- [nio-9003-exec-3] c.c.s.c.ComputeController@47289387 : /add, host:192.168.43.85, service_id:clc-service结果:2