【SpringCloud】一、微服务概述、注册中心与Ribbon负载均衡技术简介

这篇具有很好参考价值的文章主要介绍了【SpringCloud】一、微服务概述、注册中心与Ribbon负载均衡技术简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringCloud

微服务技术栈

  • 微服务治理
  • 异步通信技术 —> mq
  • 缓存技术 —> Redis
  • 搜索技术 —> ES集群
  • Devops —> Jenkins…

微服务

微服务是一种将各个模块拆分开独立运行以提高系统整体效率的技术,其主要特征为:

  • 单一职责:每个服务对应唯一的业务能力、做到单一职责。
  • 面向服务:对外要暴露微服务的业务接口
  • 自治:团队独立、技术独立、数据独立、部署独立,可以根据业务进行不同的技术选型
  • 隔离型强:服务的调用要做好隔离、容错、降级,避免出现一个模块的错误影响到其他模块的问题

微服务框架

国内的知名微服务框架有SpringCloud和Dubbo(阿里巴巴)

用户访问服务网关,服务网关请求路由负载均衡(服务集群),服务集群在注册中心中拉取注册和服务信息,在配置中心中拉取配置信息。

Dubbo SpringCloud SpringCloudAlibaba
注册中心 zookeeper、Redis Eureka、Consul Nacos、Eureka
服务远程调用 Dubbo协议 Feign(http协议) Dubbo、Feign
配置中心 SpringCloudConfig SpringCloudConfig、Nacos
服务网关 SpringCloudGateway、zuul SpringCloudGateWay、zuul
服务监控和保护 dubbo-admin、功能弱 Hystrix Sentinel

SpringCloud

SpringCloud组件

  • 服务注册发现:

    Eureka、Nacos、Consul

  • 远程服务调用:

    OpenFeign、Dubbo

  • 服务链路监控:

    Zipkin、Sleuth

  • 统一配置管理:

    SpringCloudConfig、Nacos

  • 统一网关路由:

    SpringCloudGateWay、Zuul

  • 流控、降级、保护:

    Hystix、Sentinel

注意:SpringCloud与SpringBoot有较为严格的匹配关系、一定要注意兼容性

服务远程调用

由于业务有可能涉及到多个模块,但同时由于微服务的限制我们不能重复开发功能,所以有了服务远程调用的概念,在业务实现时,一个模块调用另外一个模块就成为服务远程调用

服务远程调用的流程

令模块发送Http请求

使用到RestTemplate,RestTemplate是Spring的一个功能,用来发送Http请求

  • 创建RestTemplate并注入Spring容器,在SpringBoot中,这件事只能在配置类中完成,这里在启动类中做这件事:

        /**
         * 创建RestTemplate对象用于发送Http请求
         * 并注入到Spring容器中
         * @return
         */
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
  • 在业务层(Service)注入restTemplate

        @Autowired
        private RestTemplate restTemplate;
    
  • 调用restTemplate的方法,注意什么样的请求调用什么样的方法:

            //设置请求地址
            String url = "http://localhost:8081/user/" + order.getUserId();
            //通过RestTemplate发送请求给url的这个地址,默认返回类型为json,也可以生命返回类型为一个对象,
    		//只需要在第二个参数里添加对象的反射类
    		//这里是get请求所以使用get方法
            User user = restTemplate.getForObject(url, User.class);
    

服务调用关系

调用其他模块的服务叫做消费者,被调用的模块叫做提供者

Eureka

注意在上面的原生服务远程调用中,只能将请求的链接写死,这十分不利于功能的拓展,另外,其也无法处理分布式的问题。

而Eureka可以解决这些问题。

服务提供者会将自己的端口号信息提供给eureka-server注册中心,而服务消费者会从eureka-server注册中心中拉取对应需要的模块的请求地址,如果有很多地址的话,会通过负载均衡技术选用一个地址并进行远程调用。另外,Eureka会与服务提供者保持一个心跳请求,Eureka每隔30秒回向服务提供者确认服务列表信息,心跳不正常的信息会被剔除。

Eureka负责保存服务提供者提供的信息,

实现流程:

搭建EurekaServer —> 将模块注册到eureka —> 在对应的模块中进行服务拉取,然后通过负载均衡技术进行服务选取与远程调用。

搭建Eureka

搭建Eureka服务器

  • 引入依赖

    <!--        eureka的依赖,版本信息已经在父工程中完成定义-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
  • 在启动类中添加Eureka的启动注解:@EnableEurekaServer

    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
    }
    
  • 创建配置文件并添加如下配置:

    server:
      port: 10086   #服务端口
    spring:
      application:
        name: eurekaserver  # eureka的服务名称
    eureka:
      client:
        service-url:  # eureka的地址信息
          defaultZone: http://127.0.0.1:10086/eureka
    

Eureka客户端搭建

  • 在客户端中加载Eureka客户端依赖

    <!--     Eureka客户端依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
  • 添加配置:

    # 添加服务名称,使erueka-server能够找到你的服务 
    spring:
     application:
      name: xxxservice
    
    # eureka配置,使其能够找到eureka-server注册中心
    eureka:
      client:
        service-url:  # eureka的地址信息
          defaulZone: http://127.0.0.1:10086/eureka
    

    在左下角可以将服务进行复制从而得到多个注册信息,要注意修改端口号

使用服务名获取服务列表(负载均衡)

在restTemplate调用方法的url处将链接的地址和端口号部分更改为服务名:

	//设置请求地址
    String url = "http://userservice/user/" + order.getUserId();

使用之后在配置类中为这个服务添加负载均衡注解@LoadBalanced

    /**
     * 创建RestTemplate对象用于发送Http请求
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

这样注册之后,在模块之间进行服务远程调用时就会根据负载均衡自动调用对应的端口进行服务调用

Ribbon

SpringCloud中的负载均衡是由Ribbon实现的,restTemplate发送http://userservice/user/这样的请求之后,Ribbon对这个请求进行拦截并解析userservice,其在Eureka-Server中查找对应服务名的端口号,在找到之后返回其真实的请求地址,例如:http://localhost:8080/user/若Eureka中存在多个地址的话,会对其进行负载均衡的判断来选择一个合适的地址

常见的负载均衡算法有:

  • 随机负载均衡
  • 轮询负载均衡等

负载均衡原理:

  1. 请求在发送后会被LoadBalanceInterceptor负载均衡拦截器所拦截,在拦截器中会进行以下行为:
  2. RibbonLoadBalancerClient获取请求中的服务名称(userservice)并将其传给DynamicServerListLoadBalancer
  3. DynamicServerListLoadBalancer会从Eureka中拉取服务列表并进行负载均衡的选取,在这之中,负载均衡技术存储在IRule中
  4. 选择最终的端口,并将请求补充为真实请求并发送。

Ribbon中的负载均衡算法

  • RoundRobinRule:轮询负载均衡

  • AvailablityFilteringRule:

    • 对服务器进行选择:若对某个服务器进行三次连接失败,则将这台服务器设置为“短路”状态。短路状态将持续30s,但若再次连接失败,则会将短路状态的持续时间以几何倍的添加。
    • 同时对于并发数过高的服务器,该算法也会将其标记并忽略(这个并发数可以自定义)。
  • WeightedResponseTimeRule:

    ​ 为每个服务器赋一个权重值,服务器相应时间越长,这个权重就越小,这个规则会随机的选择服务器,而赋予的权重会影响随机的 结果

  • ZoneAvoidanceRule:(默认)

    ​ 以区域可用性进行服务器选择,并在配置的区域中进行轮询选择,若不进行区域配置,则可认为其就是普通的轮询负载均衡技术, 就像是离哪里近,就选择哪里的服务器。

  • BestAvliableRule:

    ​ 忽略短路服务器并选择并发数较低的服务器

  • RandomRule:

    ​ 随机负载均衡

  • RetryRule:

    ​ 重试机制的选择逻辑

负载均衡算法的修改

在要服务消费者中进行定义,在主类(配置类)中进行如下定义:

注意这样做是全局配置,无论最终选择哪个服务进行调用都会遵循下面的规则,若想要根据不同的服务进行调用则需要使用yml配置文件进行:

    @Bean
    public IRule randomRule() {
        return new RandomRule();
    }

在配置文件中进行负载均衡算法的选取:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #定义针对于userservice的负载均衡规则

Ribbon的加载策略

Ribbon的加载策略默认为懒加载,即只有在服务拉取时才创建RibbonLoadBalancerClient对象与DynamicServerListLoadBalancer对象,这样做会使第一次进行服务获取的时间速度变得很慢。

我们可以对加载策略进行修改,修改加载策略为饥饿加载:

在yml中这样定义:文章来源地址https://www.toymoban.com/news/detail-488643.html

ribbon:
  eager-load:
    enable: true # 开启饥饿加载
    clients:
     - userservice

到了这里,关于【SpringCloud】一、微服务概述、注册中心与Ribbon负载均衡技术简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

    单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单;部署成本低(打jar包、部署、负载均衡就完成了) 缺点:耦合度高(维护困难、升级困难,不利于大项目开发) 分布式架构 根据业务功能对系统做拆分,每个业务功能模块作为独立

    2024年02月13日
    浏览(34)
  • 38.SpringCloud—注册中心(eureka/nacos)、负载均衡Ribbon

    目录 一、SpringCloud。 (1)认识微服务。 (1.1)单体架构与分布式架构(微服务)。 (1.2)微服务技术对比。 (1.3)SpringCloud。 (2)服务拆分及远程调用。 (2.1)服务拆分。 (2.2)远程调用。 (3)提供者与消费者。 (4)Eureka注册中心。 (4.1)Eureka的作用。  (4.2)搭建

    2024年02月09日
    浏览(55)
  • 【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

    服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口) 很明显,这是一个相对的概念。 上一篇中,远程调用时,url参数是写死在代码中的,而不同的测试、生产、

    2024年02月06日
    浏览(46)
  • 微服务技术栈-Ribbon负载均衡和Nacos注册中心

    在上面那个文章中介绍了微服务架构的概念以及eureka注册中心的概念,在本节中我们将继续介绍微服务技术栈的其他两个组件Ribbon和Nacos。 在上篇文章中讲到,Spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。 那么这个 负

    2024年02月07日
    浏览(42)
  • 【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)

    微服务完整的技术栈如图: 技术栈学习: 概念: 在Eureka架构中,微服务角色有两类EurekaServer: 服务端,注册中心 记录服务信息 心跳监控 EurekaClient:客户端 Provider:服务提供者,例如案例中的user-service注册自己的信息到EurekaServer;每隔30秒向EurekaServer发送心跳 consumer:服务消

    2024年02月12日
    浏览(46)
  • SpringCloud学习笔记(上):服务注册与发现:Eureka、Zookeeper、Consul+负载均衡服务调用:Ribbon

    SpringCloud=分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。 springboot版本选择: git源码地址:https://github.com/spring-projects/spring-boot/releases/ SpringBoot2.0新特性:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release springcloud版本选

    2024年02月08日
    浏览(43)
  • 注册中心Eureka和Nacos,以及负载均衡Ribbon

    微服务,就是把服务拆分成为若干个服务,降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联

    2024年02月12日
    浏览(41)
  • nacos注册中心+Ribbon负载均衡+完成openfeign的调用(超详细步骤)

    目录 1.注册中心 1.1.nacos注册中心 1.2. 微服务注册和拉取注册中心的内容 2.3.修改订单微服务的代码 3.负载均衡组件 3.1.什么是负载均衡 3.2.什么是Ribbon 3.3.Ribbon 的主要作用 3.4.Ribbon提供的负载均衡策略 4.openfeign完成服务调用 4.1.什么是OpenFeign 4.2.完成openfeign的调用  继  微服务

    2024年02月16日
    浏览(36)
  • springcloud Ribbon负载均衡服务调用

    地址:https://github.com/13thm/study_springcloud/tree/main/days6_Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时

    2024年01月20日
    浏览(48)
  • 【微服务 SpringCloud】实用篇 · Ribbon负载均衡

    微服务(4) 在前面,我们添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理、什么策略呢? SpringCloud底层其实是利用了一个名为 Ribbon 的组件 ,来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢? 为什么我

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包