【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

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

一、Eureka

1、服务提供者与消费者

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

很明显,这是一个相对的概念。

2、Eureka原理分析

上一篇中,远程调用时,url参数是写死在代码中的,而不同的测试、生产、开发环境IP不同,有集群时,端口也不能固定。

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

很明显,硬编码肯定行不通。Eureka就是来解决这个问题的。

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

  • 每个服务启动的时候,将自己的信息注册到eureka中
  • 某个服务需要调用其他服务时,向eureka拉取对应的服务信息
  • 负载均衡到其中一台(如图中的localhost:8081)
  • 进行远程调用
  • 服务实例向eureka心跳续约,每30秒一次,eureka监控到某个服务实例不再心跳时,就从其注册信息中剔除这条信息。服务消费者拉取时当然也就拉取不到这个宕掉的服务实例
  • 新启动一个服务,服务信息注册到了eureka中…以此类推

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon
接下来开始搭建Eureka,并进行服务注册和服务发现

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

3、搭建Eureka

  • 在父工程下新建eureka模块,选择Maven,点击Finish

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

  • 给该模块引入依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--版本在父工程中统一管理,这里不用写-->
  • 编写启动类,添加@EnableEurekaServer注解(自动装配的开关)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

  • 添加application.yaml文件
server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称,eureka自身也是个微服务,也要注册自己的信息到eureka注册中心
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

# eureka自身也是个微服务,也要注册自己的信息到eureka注册中心
# 王思聪住万达酒店也得身份证登记一下,虽然那就是他家的产业
  • 启动eureka模块

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon
【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

  • 注册成功

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

4、服务注册

接下来将user和order服务注册到eureka中:

  • 在user模块的pom文件中引入eureka客户端依赖
<!--eureka客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 在application.yaml文件中增加注册中心地址的配置
server:
  port: 8081
spring:
  application: 
    name: userservice
eyreka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

  • 重启user模块(order模块操作步骤相同),注册成功

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

5、模拟多服务实例启动

上面完成的注册都是单服务实例的,接下来在IDEA中模拟启动多个服务实例:

  • 右键选择拷贝

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

  • -Dserver.port覆盖yaml文件中的端口,从而换个新端口

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

  • 启动这个新服务实例,注册成功

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

6、服务的发现

接下来实现:在order服务中完成服务信息的拉取,然后通过负载均衡挑选一个user服务,实现远程调用

服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡

  • 修改order代码,将服务IP和端口改为服务名
String url ="http://userservice/user/" + order.getUserId();
  • 在order启动类OrderApplication中的RestTemplate添加负载均衡注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
	return new RestTemplate();
}
  • 分别调用order接口两次,传参101和102,看它远程调用了哪个user服务实例

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

  • 可以看到两个服务实例均有对应的日志,成功!

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

二、Ribbon

1、负载均衡的原理

分析:

我在浏览器中直接访问http://userservice/user/,访问失败,这是因为userservice既不是可用域名,也不是IP。那order调用到user服务的过程中经历了什么呢?

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

  • order发起请求
  • Ribbon拦截请求,拿到服务名,向eureka拉取信息
  • eureka返回服务列表信息给Ribbon
  • Ribbon将请求轮询到相应的服务地址上去

具体信息,在源码中打断点来调试看看。

2、源码分析

@LoadBalanced注解,就标识了调用方当前这个restTemplate这个对象发起的请求,要被Ribbon拦截

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon
LoadBalancerInterceptor实现了ClientHttpRequestInterceptor接口:

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

在LoadBalancerInterceptor接口重写的intercent方法上打断点,调用order接口(中途会对user服务发起远程调用),断点进入到了这里:

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

继续往下,看到了Ribbon对象

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

继续往下:成功从eureka拿到服务列表信息

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon
继续往下调试,看到了IRule这个接口,决定了负载均衡的策略

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

以上,调用接口http://localhost:8080/order/102后发生的事情如图:
- 接口中途通过restTemple远程调用http://userservice/user/1
- 被负载均衡拦截器拦截
- 获取url中的服务id,即userservice
- 动态服务列表均衡器向eureka拉取userservice的信息
- eureka返回服务列表给DynamicServiceListLoadBalancer
- 通过IRule挑选出某个服务,返回给RibbonLoadBalancerClient
- 请求被转发到了某个一具体的实例上

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

3、负载均衡策略

Ribbon的负载均衡策略是由IRule接口来定义的,它的每一个子接口就是一种策略。

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

具体的含义为:

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon
以上策略中,Ribbon默认的是ZoneAvoidanceRule。想修改负载均衡策略有这两种方法:

代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:

@Bean
public IRule randomRule(){
	return new RandomRule();  //改为随机
}

配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则

userservice: 
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  #负载均衡规则

此时,多次调用order接口(代码中途远程调用user):

http://localhost:8080/order/102

可以看到转发到user实例上的请求不再有明显规律。

4、饥饿加载

重启order服务,然后两次访问order接口,发现耗时相差巨大:

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon
【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,因此请求时间会很长。

饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下配置开启饥饿加载:

ribbon:
  eager-load: 
    enabled: true #开启饥饿加载
    clients: userservice  # 指定对userservice这个服务饥饿加载
       
# clients为list,可添加多个

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon文章来源地址https://www.toymoban.com/news/detail-455838.html

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

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

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

相关文章

  • springcloud五大组件:Eureka:注册中心、Zuul:服务网关、Ribbon:负载均衡、Feign:服务调用、Hystix:熔断器

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件:Eureka Server和Eure

    2024年04月10日
    浏览(32)
  • 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日
    浏览(42)
  • SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

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

    2024年02月13日
    浏览(27)
  • springcloud Eureka服务注册与发现

    代码上传到 :https://github.com/13thm/study_springcloud/tree/main/days3 什么是服务治理 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 什么是服务注册与发现 Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使

    2024年01月18日
    浏览(55)
  • 【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现

    🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 当有两个服务,第一个服务需要远程调用第二个服务,采用的方式是发起一次HTTP请求,在之前的代码中是将服务提供者的ip和端口号硬编码到

    2024年02月07日
    浏览(34)
  • SpringCloud服务注册与发现组件Eureka(五)

    Eureka github 地址: https://github.com/Netflix/eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功

    2024年02月09日
    浏览(39)
  • 什么是SpringCloud Eureka服务注册与发现

    😀前言 本篇博文是关于SpringCloud Eureka 介绍,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰 如果文

    2024年02月09日
    浏览(40)
  • 【SpringCloud微服务】- Eureka服务注册与服务发现Discovery

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件: Eureka Server 和 E

    2024年02月03日
    浏览(39)
  • SpringCloud_Eureka服务的注册与发现

    分布式:分布式解决的是系统性能问题: 即 解决系统部署上单点的问题 ,尽量让组成系统的子系统分散在不同的机器上进而提高系统的吞吐能力。 即多个相同的子系统在不同的服务器上。 分布式系统架构存在问题通过服务治理解决。 微服务:将系统的业务功能划分为极小

    2023年04月22日
    浏览(39)
  • SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

    一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于springboot的,所以需

    2024年02月11日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包