在原有基础上添加服务调用者。大体思路为:
第一步、创建eureka注册中心;
第二步、注册服务;
第三步、调用服务;
前两步骤可以参考文章。
一、创建调用服务程序
创建web项目,用来消费服务。
实现功能:获取eureka服务中的服务列表、获取指定服务、获取指定服务并且通过RestTemplate方式消费服务、修改Ribbon负载均衡策略。
pom文件配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client
</artifactId>
</dependency>
<!-- spring-cloud-starter-netflix-eureka-client 需要手动引入actuator包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置文件,向eureka注册服务
# 应用名称
spring.application.name=customer
# 应用服务 WEB 访问端口
server.port=8002
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/
服务
@Autowired
DiscoveryClient client;
@Autowired
EurekaClient eurekaClient;
/**
* Ribbon获取服务
*/
@Autowired
LoadBalancerClient lb;
/**
* 获取服务列表
* @return
*/
@GetMapping("getServers")
public Object getServers() {
List<String> services = client.getServices();
return services;
}
/**
* 获取指定的服务
* @return
*/
@GetMapping("listServersById")
public Object getServerById() {
List<ServiceInstance> provider = client.getInstances("provider");
return provider;
}
/**
* 输出指定服务的所有信息
* @return
*/
@GetMapping("getServerDetail")
public Object getServerDetail() {
List<ServiceInstance> provider = client.getInstances("provider");
provider.forEach(e->{
System.out.println(ToStringBuilder.reflectionToString(e));
});
return provider;
}
/**
* 获取指定服务,并且通过resttemplate调用响应服务
* @return
*/
@GetMapping("sendProvider")
public Object sendProvider() {
// 具体服务
// List<InstanceInfo> provider = eurekaClient.getInstancesById("LAPTOP-CCRUI6V2:provider:8001");
List<InstanceInfo> provider = eurekaClient.getInstancesByVipAddress("provider", false);
provider.forEach(e->{
System.out.println(ToStringBuilder.reflectionToString(e));
});
if (provider.size() > 0){
//
InstanceInfo instanceInfo = provider.get(0);
if (instanceInfo.getStatus() == InstanceInfo.InstanceStatus.UP){
// 拼装url
String url = "http://" + instanceInfo.getHostName() + ":" + instanceInfo.getPort() + "/getPort";
RestTemplate restTemplate = new RestTemplate();
String forObject = restTemplate.getForObject(url, String.class);
return forObject;
}
}
return provider;
}
/**
* 服务的负载均衡
* @return
*/
@GetMapping("client5")
public Object client5() {
// 具体服务
// ribbon完成客户端的负载均衡
ServiceInstance instanceInfo = lb.choose("provider");
// 组装数据
String url = "http://" + instanceInfo.getHost() + ":" + instanceInfo.getPort() + "/getPort";
RestTemplate restTemplate = new RestTemplate();
String forObject = restTemplate.getForObject(url, String.class);
return forObject;
}
二、测试
打开eureka管理页面
测试服务调用者”customer“是否正常,点击status对应的url,通过修改url,进行测试
1.获取服务列表 http://laptop-ccrui6v2:8002/getServers
2.获取指定服务http://laptop-ccrui6v2:8002/listServersById
......
n-1:取指定服务,并且通过resttemplate调用响应服务
http://laptop-ccrui6v2:8002/sendProvider
输出的端口是固定的。
n: 采用负载均衡策略调用服务:http://laptop-ccrui6v2:8002/client5
会轮询端口。
三、扩展
3.1 Ribbon策略修改
方法一:注入形式
@Bean
public IRule myRule() {
return new RandomRule();
}
方法二:配置文件指明
provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
方法三:自定义
3.2 获取服务的url,不需要进行拼接
依靠@LoadBalanced注解
@Bean
@LoadBalanced
RestTemplate getRestTemplate() {
return new RestTemplate();
}
使用
// 组装数据
String url = "http://provider/getPort";
String forObject = restTemplate.getForObject(url, String.class);
3.3 调用者,调用指定服务
调用者,调用指定服务,忽略负载均衡策略;
#关闭eureka
ribbon.eureka.enabled=false
#本地直连
ribbon.listOfServers=localhost:8000