抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

上一篇总结了Eureka,并且创建了一个客户端provider,这次总结一下ribbon,实现微服务负载均衡。

Spring Cloud Ribbon介绍

一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制。

客户端负载均衡即是当浏览器向后台发出请求的时候,客户端会向 Eureka Server 读取注册到服务器的可用服务信息列表,然后根据设定的负载均衡策略(没有设置即用默认的),抉择出向哪台服务器发送请求。

负载均衡服务器端和客户端的区别

服务器端

通常使用nginx实现负载均衡,如下图

nginx代理服务器,然后选择可用的服务器发送请求。

客户端

也就是咱们Ribbon,如下图

Ribbon负载均衡实现

Ribbon子项目搭建

接着上一篇再创建一个子项目consumer-ribbon

pom文件

其他都一样,引入ribbon

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
yml配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka01:8800/eureka/,http://eureka02:8810/eureka/
server:
  tomcat:
    uri-encoding: UTF-8
  port: 10001
#  servlet:
#    context-path: /gbq_consumer_ribbon
spring:
  application:
    name: consumer_ribbon

注意,不要配置context-path 或者server-path,这样当你的微服务被调用时,会出现找不到的报错!如果非要加,请自行百度一下,我查到的并不太好使!

启动类
@SpringBootApplication
//@EnableDiscoveryClient //从Spring Cloud Edgware开始,@EnableDiscoveryClient 或@EnableEurekaClient 可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
public class ConsumerRibbonApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerRibbonApplication.class, args);
    }
    //开启restTemplate负载均衡
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
    /**
     * 配置随机负载策略,需要配置属性service-B.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
     */
    @Bean
    public IRule ribbonRule() {
        return new RandomRule();
    }
}

Controller

@RestController
public class HiController {

    @Autowired
    private HiService hiService;

    @GetMapping("/hi")
    public String sayHello(String name){
        return hiService.sayHello(name);
    }
}

Service实现类

@Service
public class HiServiceImpl implements HiService {

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public String sayHello(String name) {
        String url = "http://provider/hello?name="+name; 
        return restTemplate.getForObject(url,String.class);
    }
}

这样ribbon就新建完毕了。

那么ribbon需要调用provider提供者服务的hello接口,我们需要再provider这个项目中写这么一个接口!

provider子项目接口实现

controller

@RestController
public class HelloController {

    @Value("${server.port}")
    private int port;


    @GetMapping("/hello")
    public String sayHello(String name){
        return "你好,cloud"+"name:"+name+"port:"+port;
    }
}

你要实现负载均衡,那么还需要一个provider提供者服务作为参照,结果才能明显

provider-copy子项目搭建

直接复制一份provider,修改名字和yml配置即可

yml配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka01:8800/eureka/,http://eureka02:8810/eureka/
  instance:
    prefer-ip-address:  true  #将自己的ip地址注册到Eureka服务中
server:
  tomcat:
    uri-encoding: UTF-8
  port: 9902  #改变端口号即可
#  servlet:
#    context-path: /gbq_provider
spring:
  application:
    name: provider  #名称需要一样

注意:只要修改端口即可

其他都一样。

启动

咱们看一下负载均衡的效果,这里拿postman测试!

端口号,看到变化了吧!!!

评论