程序员

原来Ribbon如此简单易用!!!

作者:admin 2021-07-10 我要评论

Springcloud的核心组件之Ribbon 上篇文章详细介绍了springcloud的注册中心Eureka,那么这篇文章则会介绍springcloud的另外一个组件Spring Cloud Ribbon以及我们较...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

Springcloud的核心组件之Ribbon

上篇文章详细介绍了springcloud的注册中心Eureka,那么这篇文章则会介绍springcloud的另外一个组件Spring Cloud Ribbon以及我们较为熟知同样起到了负载均衡作用的Nginx,二者又有怎样的区别呢?

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
Spring Cloud Ribbon虽只是一个工具类框架,它在服务体系中起着重要作用,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务基础设施中。

如何集成Ribbon?

① 首先引入Ribbon依赖

其实这里不引用ribbon依赖也是可以的,因为在spring-cloud-starter-netflix-eureka-client依赖中已经包含了Ribbon Starter。

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

②?在启动类中添加@EnableDiscoveryClient注解

@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringcloudClientApplication.class, args);
    }
}

③ RestTemplate的使用

提到Ribbon就必须要介绍一下RestTemplate!RestTemplate是Spring提供的一个访问Http服务的客户端类! 传统情况下访问restful服务,一般使用Apache的HttpClient。不过这种方式使用太过繁琐。spring提供了一种简单便捷的模板类进行操作,也就是RestTemplate类。

如下所示:

 /**
     * LoadBalanced:使RestTemplate以负载均衡的方式调用服务
     * @return
     */
    @Bean
    @LoadBalanced
     public RestTemplate restTemplate(){
         return new RestTemplate();
     }

④验证Ribbon的负载均衡

代码案例:

思路:1.启用注册中心,2.创建两个服务提供者,3.创建服务消费者,以restTemplate的方式调用服务提供者,查看ribbon组件是否以负载均衡的方式调用服务提供者。

1 :启动注册中心,可以参考之前的文章

注册中心启动,可以进群要源码

2:创建两个服务者,并启动

#服务端口    配置如下
server.port=8066
#服务名称
spring.application.name=provider-client
#服务地址
eureka.instance.hostname=localhost
#取消检索服务
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true

#注册中心路径,表示向这个注册中心注册服务,如果向注册中心注册多个服务,用“,”进行分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8011/eureka

3:创建控制器,提供服务,返回端口信息

@RestController
public class RibbonController {
    @GetMapping("/testRibbon")
    public String hello(String name , HttpServletRequest request){
        //返回端口信息
        return " 此时被调用的服务端口为: " + request.getServerPort() + " , hello " + name;
    }
}

4:第二个服务提供者和上面类似只是配置文件的端口不一致

#服务端口
server.port=8077
#服务名称
spring.application.name=provider-client
#服务地址
eureka.instance.hostname=localhost
#取消检索服务
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true

#注册中心路径,表示向这个注册中心注册服务,如果向注册中心注册多个服务,用“,”进行分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8011/eureka

5:启动消费者,以RestTemplate方式调用

  • 配置文件如下:
#服务方端口
server.port=8091
#服务名称
spring.application.name=consumer-client-01
#服务地址
eureka.instance.hostname=localhost
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=consumer-client-01
#取消检索服务
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true
#注册中心路径,表示向这个注册中心注册服务,如果向注册中心注册多个服务,用“,”进行分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8011/eureka
  • 使用RestTemplate类访问restful服务
@Configuration
public class RestTemplateTest {
    /**
     * 添加LoadBalanced,使RestTemplate以负载均衡的方式调用服务
     * @Configuration:类上面务往添加@Configuration注解
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
 
  • 创建控制器,调用服务提供者
@RestController
public class ConsumerController {
   @Autowired
   private RestTemplate restTemplate; //注入RestTemplate

   @GetMapping("/sayHello")
   public String sayHello(String name){
       String url = "http://provider-client/test?name=" + name;
       String result = restTemplate.getForObject(url , String.class);
       return result;
   } 
}

6:启动消费者服务,并查看注册中心注册情况

提供者和服务消费者成功注册到注册中心

7:访问服务消费者,验证服务调用是否以负载均衡方式

第一次访问端口为8066

第二次访问端口则为8077

发现两个服务提供者服务分别被调用了2次,说明Ribbon默认的负载均衡策略是轮询的方式。小伙伴们也可以多调用几次验证一下

Ribbon和Nginx的区别

Ribbon和Nginx都是起到负载均衡的作用,但是二者又有怎么样的区别呢??

Ribbon 是Netflix公司的一个处理负载均衡开源的项目,它是运行在服务端的负载均衡器,如下图。

Ribbon过程

如上图所示很清晰的描述了其工作原理就是Consumer端获取到了所有的服务列表之后,在其内部使用负载均衡算法,使用轮询的方式对多个服务进行调用。

nginx过程

相比Nginx我们可以看到的是Nginx是接收了所有的请求进行之后进行的负载均衡处理。

简单的总结来说:
Nginx: 服务器端负载均衡,ribbon在服务节点挂掉后,可以自动去除节点。
Ribbon:客户端负载均衡,nginx剔除不可用节点相对复杂。

欢迎关注公众号!
公众号回复:入群 ,扫码加入我们交流群!

扫码关注公众号获取更多学习资料

;原文链接:https://blog.csdn.net/weixin_36133625/article/details/115690553

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 原来Ribbon如此简单易用!!!

    原来Ribbon如此简单易用!!!

  • Tomcat和Servlet的学习笔记总结

    Tomcat和Servlet的学习笔记总结

  • Java游戏:简单的贪吃蛇小游戏

    Java游戏:简单的贪吃蛇小游戏

  • 从Win32过渡到MFC第四天

    从Win32过渡到MFC第四天

腾讯云代理商
海外云服务器