概述
访问指定服务,实现负载均衡,即访问相同服务名提供者,不同客户端提供的不同端口,可以设置轮询/随机/权重。
不同客户端之前的访问,也是要通过负载均衡来完成。
效果图
注册中心,注册了3个客户端,ribbon和两个erueka-client
访问ribbon的网址,ribbon会访问指定服务端名,调用集群,反复刷新页面,会看到8092或者8091的端口号被调用。
项目结构
1. application.properties配置
也是配置成一个eureka-client
server.port=8094
spring.application.name=service-ribbon
#eureka -client
eureka.instance.preferIpAddress=true
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
2. 启动类
在启动类中,需要配置拦截逻辑LoadBalanced,以及轮询方式IRule。若不配置轮询方式,默认是随机轮询。
启动类代码:
@SpringBootApplication
@EnableEurekaClient
public class RibbonServerStart {
public static void main(String[] args) {
SpringApplication.run(RibbonServerStart.class, args);
}
@Bean
@LoadBalanced//添加ribbon的拦截逻辑,否则无法实现服务调用
public RestTemplate initRestTemplate(){
return new RestTemplate();
}
@Bean
public IRule initRule(){
return new RandomRule(); //随机
//return new RoundRobinRule(); //轮询(默认)
//响应时间权重.会根据后端访问的实例的响应时间,动态调整权重值.
//响应时间越长,性能越低,权重值越低
//return new WeightedResponseTimeRule();
}
}
3. 配置控制层和服务层逻辑
控制层:
@RestController
public class RibbonController {
@Autowired
private RibbonServer rs;
@RequestMapping("ribbon/getName")
public String printInfo(String name) {
return "Ribbon:" +rs.printInfo(name);
}
}
在服务层中,通过RestTemplate,将请求发送到指定的服务service-hi的指定接口/client/name,参数和接口与目标客户端保持一致,返回数据。
@Service
public class RibbonServer {
@Autowired
private RestTemplate temple;
public String printInfo(String name) {
String url = "http://service-hi/client/name?name=" + name;
String body =temple.getForObject(url, String.class);
return body;
}
}
4. pom配置
<dependencies>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
工程的启动
需要启动ribbon, erueka-server, erueka-client(8091和8092端口)。
8091和8092只是一套代码,只是启动了两次,设置不同的端口号而已。