服务消费者的目标只有两个:发现服务,消费服务。其中服务的发现由Eureka客户端提供,而服务的消费由Ribbon完成。
Ribbon是一个基于Http和Tcp的客户端负载均衡器,他可以在通过客户端配置的ribbonServerList服务端列表去轮询访问以达到负载均衡的作用。当Ribbon与Eureka联合使用时,Ribbon的服务清单RibbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心获取服务端列表。
我们先启动上一节的服务端*2和接口提供端,用于测试注册的服务时候能够使用,以及负载均衡。
然后另外新建一个消费端,消费端除了普通的springboot项目需要的依赖,还要在pom文件加入以下内容
代码语言:javascript复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 这里为了监察运行情况,我加入了下面这个引用,如果不需要监察可以不加-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
下面是消费方的application.java代码:
代码语言:javascript复制
@EnableDiscoveryClient
@SpringBootApplication
public class BlogApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(BlogApplication.class, args);
}
}
可以看出来和服务提供方的差别并不是特别大。
其中@LocalBalanced可以提供负载均衡
(https://blog.csdn.net/xiao_jun_0820/article/details/78917215)
消费方的restful api如下:
代码语言:javascript复制@RestController
public class ConsumerController{
private final Logger logger = Logger.getLogger("ConsumerController");
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/ribbon-consumer")
public String helloConsumer(@RequestParam String name){
logger.info("进入了方法");
return restTemplate.getForEntity("http://EUREKA-CLIENT/hello?name=" name,String.class).getBody();
}
}
这里为了增加互动性,我将之前的eureka-client的hello接口修改了以下
代码语言:javascript复制@RequestMapping("/hello")
public String index(@RequestParam String name) {
ServiceInstance instance = client.getInstances(registration.getServiceId()).get(0);
logger.info("/hello,host: " instance.getHost() " , service_id: " instance.getServiceId());
return "Hello " name "!";
}
至此,访问我们的消费者api的链接http://localhost:8081/ribbon-consumer?name=JathonKatu
可以看到结果
可以观察提供接口的类此时的日志:
代码语言:javascript复制2020-04-12 19:24:28.871 INFO 23240 --- [io-8080-exec-10] HelloController : /hello,host: DESKTOP-VVVH0SM , service_id: EUREKA-CLIENT
2020-04-12 19:29:06.633 INFO 23240 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
说明我们的服务已经通过平台调通了。
并且,我将服务提供方放在peer1的Eureka服务器上,将服务的消费方放在peer2的Eureka服务器上,通过两台服务器的高可用互相备份,最终访问通过,和网上说的必须放在同一Eureka服务器上个并不一致。