spring cloud ribbon 负载均衡器,实现简单的轮询调用

ribbon实现步骤

  • 一:创建eureka,两个producter服务(不做介绍),一个ribbon服务
  • 二:ribbon服务
  1. pom
	<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
			<groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  1. application.properties配置
server.port= 9010
spring.application.name= server-ribbon
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9000/eureka
  1. 新建collection
@RestController
public class TestController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping("/test")
    public String test() throws ExecutionException, InterruptedException {
        //server-producer为 producer服务的 spring.application.name=server-producer
        //两个服务的名称一致,端口不一致,(本demo分别为:9101和9101)
        ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
        //负载均衡算法默认是轮询,轮询取得服务
        URI uri = URI.create(String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()));
        return uri.toString();
    }
}
  1. 在原有基础上进行添加,(本例中两个producter服务,接口路径,服务名均相同,除端口,test接口返回值不同,其余相同)
  2. application.properties配置添加
server.port= 9010
spring.application.name= server-ribbon
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9000/eureka
//为特定的服务配置负载均衡策略(server-producer服务名)
server-producer.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
  1. 在ribbon服务启动类添加,和@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApplication {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }
}
  1. 在testCollection添加test1方法
 	@Autowired
    private LoadBalancerClient loadBalancerClient;
	//注入 RestTemplate 
    @Autowired
    private RestTemplate restTemplate;
	@GetMapping("/test1")
 	public String test1() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
		//http://这里是服务名(server-producer)/这里collection对应路径(test)
        String s = this.restTemplate.getForObject("http://server-producer/test", String.class);
        return s+serviceInstance.getPort();
    }
  1. 启动测试
    在这里插入图片描述
    在这里插入图片描述
    至此简单的轮询调用完成

结合 - 断路器使用

  • 当某一个服务出现宕机,异常时可配置
  • 添加pom
	<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.5.RELEASE</version>
        </dependency>
  • 启动类添加@EnableHystrix注解
  • 修改testCollection
	//fallbackMethod = "getServiceError"  getServiceError为调用方法
 	@HystrixCommand(fallbackMethod = "getServiceError")
    @GetMapping("/test1")
    public String test1() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
        String s = this.restTemplate.getForObject("http://server-producer/test", String.class);
        return s+serviceInstance.getPort();
    }

    public String getServiceError() {
        return "出现错误!!!!;调用getServiceError()";
    }
  • 启动测试
    依次启动eureka,两个producter,ribbon,能正常轮询访问后,停掉其中一个producter服务,再次访问 http://localhost:9010/test1
    当调用停止的服务时
    在这里插入图片描述
    正常时
    在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值