服务发现的任务由eureka的客户端完成,而服务消费的任务由ribbon完成,ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以通过客户端配置的 ribbonServerList服务端列表去轮询访问以达到负载均衡的作用。
当Ribbon和eureka联合使用时,ribbon的服务实力清单ribbonServerList被DisconveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。
同时也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务是否已经启动,实现了一套对服务实例的选择策略,从而实现对服务的消费
1.首先启动之前的eureka-server和hello-service服务,使用不同的端口号启动hello-service服务
java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8081
java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8082
2.创建一个spring boot的基础过程来实现服务消费者ribbon-consumer,并在pom.xml文件中引入一下依赖内容,较之前的hello-service新增依赖spring-cloud-starter-netflix-ribbon
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</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>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.在ribbon-consumer的启动类上添加注解@@EnableDiscoveryClient注解,让该服务应用注册为Eureka客户端应用,以获得服务发现的能力,在该主类中创建RestTemplate的spring bean实例,并通过@LoadBalanced注解开启客户端负载均衡。
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
4.创建ConsumerController类,通过RestTemplate来实现对HELLO-SERVICE服务提供的/hello接口进行调用,这边访问的地址是服务名HELL0-SERVICE,也就是注册中心eureka该服务对于的application.name,而非一个具体的地址
@RestController
@RequestMapping("/api")
public class ConsumerController {
@Autowired
public RestTemplate restTemplate;
@RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET)
public String helloConsumer() {
return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
}
}
5.在eureka中注册ribbon-consumer,配置文件application.yml配置
server:
port: 9000
spring:
application:
name: ribbon-consumer
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
启动项目,在eureka中我们也可以看到ribbon-consumer已经注册。
6.通过http://localhost:9000/api/ribbon-consumer发起请求,网页上会显示hello world,在cmd窗口会打印信息,多次发生请求,并观察cmd窗口会交替打印日志信息