SpringCloud之Eureka的学习【详细】

这篇具有很好参考价值的文章主要介绍了SpringCloud之Eureka的学习【详细】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

服务架构演变

单体架构

分布式架构

分布式架构需要考虑的问题

微服务

架构比较

微服务技术对比

服务拆分注意事项

案例

服务远程调用

RestTemplate

Eureka注册中心

RestTemplate存在的问题

服务调用考虑的问题

Eureka的作用

搭建EurekaServer

服务注册

服务发现

Ribbon负载均衡

负载均衡流程

负载均衡策略更改

Ribbon加载方式


微服务开发,实现充分解耦

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

服务架构演变

单体架构

将业务的所有功能集中在一个项目中开发,打成一个包部署

优点:架构简单、部署成本低

缺点:耦合度高

分布式架构

根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,成为一个服务

优点:降低服务耦合、有利于服务升级拓展

缺点:成本上升,需要搭建集群等

分布式架构需要考虑的问题

  • 服务拆分粒度如何
  • 服务集群地址如何维护
  • 服务之间如何实现远程调用
  • 服务健康状态如何感知

微服务

微服务是一种经过良好架构设计的分布式架构方案。

微服务架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
  • 面向服务:微服务对外暴露业务接口
  • 自治:团队独立、技术独立、数据独立、部署独立
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

架构比较

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

微服务技术对比

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

服务拆分注意事项

  • 不同微服务,不要重复开发相同业务
  • 微服务数据独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

案例

数据准备,两个数据库中分别有一个表

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

创建项目

demo链接:https://pan.baidu.com/s/19DcTpkvCdHixQaLCiAYbBw?pwd=zmbw

服务远程调用

RestTemplate

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

有一种远程调用方式为A模块访问B模块的某个方法url地址,然后B模块返回结果给A模块。

现在我们需要实现一个查询订单的功能,这里需要订单模块像用户模块发起一个查询用户的请求。发起请求我们可以采用RestTemplate来实现

首先在Order的引导类中将RestTemplate加载为Bean

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(basePackages = "com.zmt.clients")
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

在OrderService中使用RestTemplate

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //利用RestTemplate查询
        String url="http://localhost:8081/user/"+order.getUserId();
        //发送请求,得到JSON对象,如果给定需要转化的对象,则会转换为Java对象
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        // 4.返回
        return order;
    }
}

Eureka注册中心

RestTemplate存在的问题

采用硬编码的方式去调用服务。不符合分布式中集群的使用场景。

服务调用考虑的问题

  • 服务消费者该如何获取服务提供者的地址信息?
  • 如果有多个服务提供者,消费者该如何选择?
  • 消费者如何得知服务提供者的健康状态?

Eureka的作用

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

当服务器启动后,会主动将自己的信息注册到Eureka-server中,当一个服务器需要远程调用另一个服务器中心方法时,需要从Eureka-server中拉去对应的地址信息,如果存在多个地址,则采用负载均衡的策略调用对应服务器。存活的服务器每三十秒向Eureka-server中发送一次心跳,当Eureka-server超过30秒没有接收到心跳,则会将对应的地址从注册中心中剔除。防止其他服务器调用到对应地址服务器。

搭建EurekaServer

新建一个Maven项目,并配置如下依赖

    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>cn.itcast.demo</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zmt</groupId>
    <artifactId>eureka-serve</artifactId>

    <dependencies>
      <!-- Eureka服务 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <!-- 特别容易导错文件,启动报错一定检查pom是否导入正确 -->
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

编写启动类,并添加注解

@SpringBootApplication
@EnableEurekaServer//开启Eureka服务
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

添加配置文件

server:
  port: 8082
spring:
  application:
    name: eureka-serve # 服务名称

eureka:
  client:
    register-with-eureka: true #false 标识不向注册中心注册自己
    fetch-registry: false # false 表示自己就是注册中心,维护服务实例即可,不需要去检索服务
    service-url: # eureka的地址信息
      defaultZone: http://127.0.0.1:8082/eureka/

随后启动服务

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

点击进入Eureka界面

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

服务注册

现在将用户模块与订单模块注册到Eureka-Server中,需要引入Eureka-Client依赖,并添加配置文件

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
spring:
  application:
    name: xxx-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8082/eureka/

之后启动服务观察Eureka页面

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

此时实例数都分别为1,现在测试集群下的实例,一个模块启动多个服务。具体操作如下

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

启动后观察

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

服务发现

在RestTemplate加载为Bean的方法上添加@LocdBalanced注解(意为负载均衡策略),用服务提供者的服务名进行远程调用。

@Bean
@LoadBalanced//负载均衡策略
public RestTemplate restTemplate(){
    return new RestTemplate();
}
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //将具体的地址修改为服务名称
        String url="http://user-server/user/"+order.getUserId();
        //发送请求,得到JSON对象,如果给定需要转化的对象,则会转换为Java对象
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        // 4.返回
        return order;
    }

访问地址观察结果

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

Ribbon负载均衡

负载均衡流程

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

使用RestTemplate访问服务名的地址实际上并不是真实的url地址,通过Ribbon将格式转化,从eureka-server中拉去需要转化的信息,然后返回服务列表由Ribbon来决定使用哪个地址

发现服务后,具体如何请求到对应的服务器上,接下来看源码分析

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

getServer()方法去做具体均衡策略

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

点击进去观察

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

进入chooseServer()方法观察

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

rule中存在如下几个实现类来决定如何实现分配

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

消费者通过服务者提供的服务名进行远程调用时,请求被Ribbon负载均衡所拦截,Ribbon去eureka-server拉取生产者的信息,eureka-server返回服务列表给Ribbon,由Ribbon选择访问哪个服务器具体拦截方式,通过RestTemplate上面的@LocdBalanced注解拦截,拦截通过RestTemplate发送的请求

负载均衡策略更改

1、全局更改(该消费者无论访问哪个服务都使用该策略)

SpringCloud之Eureka的学习【详细】,spring cloud,学习,spring

在消费者的启动类下加入IRule的Bean(即,重写默认的IRule),return一个需要的负载均衡策略对象。

2、针对某一生产者的修改

在application.yml中配置生产者的服务名以及负载均衡策略。

user-server: #生产者服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.Loadbalancer.RandomRule #选择负载均衡策略

Ribbon加载方式

Ribbon默认采用懒加载方式。也就是用到的时候才会进行加载,这就决定了,第一次访问时,耗时会长一些。也可以在配置文件中选择饥饿加载。具体配置如下文章来源地址https://www.toymoban.com/news/detail-734748.html

ribbon:
  eager-load:
    enabled: true #开启饥饿加载
    clients:
      - user-server
      - xxx-server

到了这里,关于SpringCloud之Eureka的学习【详细】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【spring cloud学习】2、Eureka服务注册与发现

    一套微服务架构的系统由很多单一职责的服务单元组成,而每个服务单元又有众多运行实例。由于各服务单元颗粒度较小、数量众多,相互之间呈现网状依赖关系,因此需要服务注册中心来统一管理微服务实例,维护各服务实例的健康状态。 从宏观角度,微服务架构下的系统

    2024年02月10日
    浏览(37)
  • Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)

    这篇文章先讲述一下Eureka的应用场景、代码实现案例,多个服务模块注册到Euraka中,服务之间的调用实现我会再下一篇文章中进行讲解! Eureka主要是做: 注册发现中心 服务注册与发现的组件 说到Eureka不得不提到了CAP,那么什么是CAP原则呢,下面一起来看下! CAP 原则: 又称

    2024年02月15日
    浏览(29)
  • SpringBoot、SpringCloud、Spring Cloud Alibaba版本对照表(详细)

    由于 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,为了同时满足存量用户和新用户不同需求,社区以 Spring Boot 3.0 和 2.4 分别为分界线,同时维护 2022.x、2021.x、2.2.x 三个分支迭代。如果不想跨

    2024年02月12日
    浏览(40)
  • SpringBoot、SpringCloud、Spring Cloud Alibaba版本对照表(详细准确)

    ❤️一切信息来自官网,准确详细❤️ Spring Cloud Version Spring Boot Version 2022.0.x aka Kilburn 3.0.x 2021.0.x aka Jubilee 2.6.x, 2.7.x (Starting with 2021.0.3) 2020.0.x aka Ilford 2.4.x, 2.5.x (Starting with 2020.0.3) Hoxton 2.2.x, 2.3.x (Starting with SR5) Greenwich 2.1.x Finchley 2.0.x Edgware 1.5.x Dalston 1.5.x Spring Cloud Dalston, Ed

    2024年02月13日
    浏览(30)
  • Spring Cloud学习笔记【消息总线-SpringCloud Bus】

    Spring Cloud Bus是Spring Cloud生态系统中的一个组件,用于实现微服务架构中的消息总线。它利用了轻量级消息代理(如RabbitMQ或Kafka)作为通信中间件,实现了在分布式系统中的消息传递和事件广播。 Spring Cloud Bus旨在简化微服务架构中的配置管理和状态同步。它允许将配置更改或

    2024年02月09日
    浏览(45)
  • SpringCloud学习6(Spring Cloud Alibaba)断路器Sentinel熔断降级

    SpringCloud、SpringCloudAlibaba、SpringBoot版本选择。为了避免各种千奇百怪的bug,我们还是采用官方推荐的毕业版本。 修改tomcat配置最大线程数 引入测试依赖 编写测试代码 这里同时我们在浏览器去请求该地址,响应会变得很慢 测试结论:此时会发现由于thread接口囤积大量请求,

    2023年04月08日
    浏览(42)
  • spring cloud 之 eureka

    Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理,SpringCloud将它集成在其子项目spring-cloud-netflix中 在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上 强调一下,eureka从2

    2024年02月12日
    浏览(31)
  • Spring Cloud Eureka面试题

    序号 内容 链接地址 1 Java面试题 https://blog.csdn.net/golove666/article/details/137360180 2 JVM面试题 https://blog.csdn.net/golove666/article/details/137245795 3 Servlet面试题 https://blog.csdn.net/golove666/article/details/137395779 4 Maven面试题 https://blog.csdn.net/golove666/article/details/137365977 5 Git面试题 https://blog.csdn.n

    2024年04月27日
    浏览(33)
  • springcloud:1.Eureka详细讲解

      Eureka 是 Netflix 开源的一个服务注册和发现工具,被广泛应用于微服务架构中。作为微服务架构中的核心组件之一,Eureka 提供了服务注册、发现和失效剔除等功能,帮助构建弹性、高可用的分布式系统。在现代软件开发领域,使用 Eureka 可以有效地管理和监控服务实例,实现

    2024年02月21日
    浏览(21)
  • Spring Cloud应用- Eureka原理、搭建

    初期对Spring Cloud的学习以应用搭建为主,所以内容不会太枯燥。 一直以来,自以为Spring全家桶的学习中,Spring framework是基础中的基础,部分内容也还是必须要读源码去理解底层原理,SpringMVC、SpringBoot,甚至Mybatis等等,都是如此。但是对于Spring Cloud来说,就从应用入手,以系

    2024年02月06日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包