Ribbon是Netflix公司开源的一个负载均衡的项目,这里记录一下在SpringCloud中使用Ribbon。
首先建一个服务器端项目(cloud-server),端口为8761;再建一个服务提供者项目(cloud-provider);最后一个服务调用者项目(cloud-invoker);
为服务提供者(cloud-provider)项目配置应用名cloud-provider;并建个MainController类,返回值为端口号,可以辨别调用的哪个调用者,为了显示方便用了@RestController注解
spring:
application:
name: cloud-provider
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8761/eureka/
@RestController
public class MainController {
@GetMapping("/test")
public String test(HttpServletRequest request) {
return request.getLocalPort() + "";
}
}
再修改服务提供者(cloud-provider)的启动类,输入端口号来设置端口
@SpringBootApplication
@EnableEurekaClient
public class CloudProviderApplication {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String port = sc.nextLine();
new SpringApplicationBuilder(CloudProviderApplication.class).properties("server.port=" + port).run(args);
}
}
再来看看服务调用者(cloud-invoker),配置文件就配置个端口号9000,其他没什么特殊的配置;建两个类MyRule和MyPing
public class MyRule implements IRule {
private ILoadBalancer lb;
public Server choose(Object key) {
List<Server> servers = lb.getAllServers();
System.out.println("这是定义服务器规则类,输出服务器信息:");
for (Server s : servers) {
System.out.println(" " + s.getHostPort());
}
return servers.get(0);//返回第一个实例
}
@Override
public void setLoadBalancer(ILoadBalancer lb) {
this.lb = lb;
}
@Override
public ILoadBalancer getLoadBalancer() {
return lb;
}
}
public class MyPing implements IPing {
public boolean isAlive(Server server) {
System.out.println("自定义Ping类,服务器信息:" + server.getHostPort());
return true;
}
}
在建个CloudProviderConfig类,注解里name值与服务提供者的应用名相同,configuration对应之前写的MyConfig
//name与服务提供者的应用名相同
@RibbonClient(name = "cloud-provider", configuration = MyConfig.class)
public class CloudProviderConfig {
}
最后建个MyController类,加入对外服务,服务中调用RestTemplate
@RestController
@Configuration
public class MainController {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@GetMapping("/router")
public String router() {
RestTemplate restTpl = getRestTemplate();
String json = restTpl.getForObject("http://cloud-provider/test", String.class);
return json;
}
}
然后先启动服务器端;
再启动两次服务提供者,先后输入8080、8081设置端口;
最后启动服务调用者,浏览器中输入http://localhost:9000/router,多刷新几次发现端口一直是同一个,说明MyRule中servers.get(0)生效。
======================================================================
一般情况下,Spring已经帮我们封装好了Ribbon,我们只需调用RestTemplate等API来访问服务即可。加入@LoadBalanced注解一个RestTemplate实例就具有负载均衡能力了。