Springcloud记录 Ribbon

本文详细介绍如何在SpringCloud环境中使用Ribbon实现负载均衡。通过创建服务器端、服务提供者和调用者项目,配置Eureka注册中心,自定义负载均衡规则及Ping策略,最终实现服务调用的负载均衡。

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实例就具有负载均衡能力了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值