SpringCloud之Eureka的学习【详细】

news2024/12/26 22:34:17

目录

服务架构演变

单体架构

分布式架构

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

微服务

架构比较

微服务技术对比

服务拆分注意事项

案例

服务远程调用

RestTemplate

Eureka注册中心

RestTemplate存在的问题

服务调用考虑的问题

Eureka的作用

搭建EurekaServer

服务注册

服务发现

Ribbon负载均衡

负载均衡流程

负载均衡策略更改

Ribbon加载方式


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

服务架构演变

单体架构

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

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

缺点:耦合度高

分布式架构

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

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

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

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

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

微服务

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

微服务架构特征:

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

架构比较

微服务技术对比

服务拆分注意事项

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

案例

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

创建项目

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

服务远程调用

RestTemplate

有一种远程调用方式为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的作用

当服务器启动后,会主动将自己的信息注册到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/

随后启动服务

点击进入Eureka界面

服务注册

现在将用户模块与订单模块注册到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页面

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

启动后观察

服务发现

在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;
    }

访问地址观察结果

Ribbon负载均衡

负载均衡流程

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

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

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

点击进去观察

进入chooseServer()方法观察

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

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

负载均衡策略更改

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

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

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

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

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

Ribbon加载方式

Ribbon默认采用懒加载方式。也就是用到的时候才会进行加载,这就决定了,第一次访问时,耗时会长一些。也可以在配置文件中选择饥饿加载。具体配置如下

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【达梦数据库】数据查询操作(超详细)

文章目录 数据查询1. 单表查询1. 简单查询2. 条件查询总结举例 3. 函数查询常用多行函数常用单行函数1. 字符函数2. 数值函数3. 日期时间函数常用日期型函数举例 4. 转换函数 4. 查询结果排序(order by)参数说明&#xff1a;注意事项&#xff1a; 2. 连接查询1. 交叉连接&#…

0034Java程序设计-基于Java的飞机大战游戏的设计与实现论文

文章目录 摘 要目 录系统设计开发环境 摘 要 现如今&#xff0c;随着智能手机的兴起与普及&#xff0c;加上4G&#xff08;the 4th Generation mobile communication &#xff0c;第四代移动通信技术&#xff09;网络的深入&#xff0c;越来越多的IT行业开始向手机行业转移重心…

JVM虚拟机:从结构到指令让你对栈有足够的认识

本文重点 在前面的课程中,我们学习了运行时数据区的大概情况,从本文开始,我们将对一些组件进行详细的介绍,本文我们将学习栈。栈内存主管java的运行,是在线程创建时创建的,它是线程私有的,它的生命周期是跟随线程的生命期,也就是说线程结束栈内存就释放了,对于栈来说…

web:[网鼎杯 2020 青龙组]AreUSerialz

题目 点进题目发现 需要进行代码审计 function __destruct() {if($this->op "2")$this->op "1";$this->content "";$this->process();}这里有__destruct()函数&#xff0c;在对象销毁时自动调用&#xff0c;根据$op属性的值进行…

数据结构与算法:二叉树之“堆排序”

目录 一、树概念及结构 二、二叉树树概念及结构 特殊的二叉树 三、堆的概念及结构 四、堆的创建 1、声明结构体 2、初始化 3、销毁 4、添加新元素 5、交换元素 6、向上调整 7、判断堆是否为空 8、移除堆顶元素 9、向下调整 10、获取堆元素个数 五、使用堆排序…

【网络编程】传输层——UDP协议

文章目录 一、传输层1. 再谈端口号2. 端口号范围划分3. 认识知名端口号4. 两个问题5. netstat 与 pidof 二、UDP协议1. UDP协议格式2. UDP协议的特点3. 面向数据报4. UDP的缓冲区5. UDP使用注意事项6. 基于UDP的应用层协议 一、传输层 传输层 负责负责两台计算机之间的端到端的…

阿里云2023年双11活动时间、活动入口、活动内容详细解读

阿里云2023年双11活动正在火热进行中&#xff0c;双11活动时间&#xff0c;阿里云推出了金秋上云季活动&#xff0c;活动包括满减礼包福利&#xff0c;云产品降价让利&#xff0c;下面给大家整理分享阿里云双11活动时间、活动入口、活动内容&#xff0c;助力大家轻松上云&#…

网络爬虫-Requests库主要方法解析

一、Requests库的7个主要方法 其中&#xff0c;request()是 基础方法&#xff0c;其他6个方法都是基于request()的&#xff0c;但最常用的是get() 和 head() 二、request() 13个访问控制参数&#xff1a; 三、get(): 获取某一个url链接的相关资源 四、head() 五、post() 六、…

LCR 021. 删除链表的倒数第 N 个结点

这篇也是凑数的 .... 描述 : 给定一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点 题目 : LeetCode 删除链表的倒数第Nge节点 : LCR 021. 删除链表的倒数第 N 个结点 分析 : 首先创建一个虚拟节点(哨兵节点) , 虚拟节点下一节点指向头节…

从 malloc 分配大块内存失败 来简看 linux 内存管理

文章目录 背景Glibc MallocMalloc 分配大块内存失败原因Overcommit_memory 实现OOM (Out Of Memory) 的实现 背景 应用进程 malloc 返回了null&#xff0c;但是观察到的os 的free内存还有较大的余量 &#xff0c;很奇怪为什么会这样&#xff1f; 不可能是oom导致的&#xff0…

GAMP源码阅读(上)主要类型、后处理流程、RINEX文件读取

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、GAMP 简介1、程序概述2、工具箱介绍3、函数调用关系4、程序执行流程 二、基础类型定义1、宏定义2、结构体定义3、矩阵、向量、最小二乘、卡尔…

以“信”数智,筑“广”生态:亚信科技CEO高念书受邀出席中国广电数字化赋能大会

6月30日&#xff0c;由国家广播电视总局指导、中国广电集团主办的中国广电数字化赋能大会在京召开。国家广播电视总局党组成员、副局长杨小伟&#xff0c;工信部总工程师赵志国&#xff0c;中国移动党组成员、副总经理高同庆等出席会议并致辞&#xff0c;中广电移动网络有限公司…

【ICCV2023】频率成分在少样本学习中的重要性

论文标题&#xff1a;Frequency Guidance Matters in Few-Shot Learning 论文链接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/html/Cheng_Frequency_Guidance_Matters_in_Few-Shot_Learning_ICCV_2023_paper.html 代码&#xff1a;暂未开源 引用&#xff1a;…

基于SpringBoot的医院后台管理系统设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 患者管理 公告信息管理 公告类型管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 四、结论 前言 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理…

[云原生1.] Docker镜像的创建

文章目录 1. Docker镜像概述1.1 简介1.2 镜像结构的分层详解 2. 创建Docker镜像的方法类别2.1 基于已有镜像创建2.1.1 创建流程2.1.2 示例 2.2 基于本地模板创建2.2.1 示例 2.3 基于Dockerfile 创建 3. 联合文件系统&#xff08;UnionFS&#xff09;2.1 简介2.2 特性 4. Docker…

云原生-AWS EC2使用、安全性及国内厂商对比

目录 什么是EC2启动一个EC2实例连接一个实例控制台ssh Security groups规则默认安全组与自定义安全组 安全性操作系统安全密钥泄漏部署应用安全元数据造成SSRF漏洞出现时敏感信息泄漏网络设置错误 厂商对比参考 本文通过实操&#xff0c;介绍了EC2的基本使用&#xff0c;并在功…

【排序算法】 归并排序详解!分治思想!

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 算法—排序篇 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️归并排序的思想☁️基本思想☁️归并的思想实现☁️分治法 &#x1f3…

并发编程 -常用并发设计模式

1. 优雅终止线程的设计模式 思考&#xff1a;在一个线程 T1 中如何优雅的终止线程 T2&#xff1f; 错误思路1&#xff1a;使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程&#xff0c;如果这时线程锁住了共享资源&#xff0c;那么当它被杀死后就再也没有机会释 …

C/C++角谷猜想 2020年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C角谷猜想 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C角谷猜想 2020年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 所谓角谷猜想&#xff0c;是指对于任意一个正整数&…

windows电脑安装系统后固态硬盘和机械硬盘的盘符号顺序显示错乱,解决方法

一、场景 由于电脑磁盘是SSD固态硬盘自己拓展的1T机械硬盘组成&#xff0c;固态硬盘分为C、D两个盘区&#xff0c;机械硬盘分为E、F两个盘区。为了提升运行速度&#xff0c;系统安装在C盘&#xff0c;安装完成后按照习惯盘区顺应该为C、D、E、F&#xff0c;但实际情况却是D、E…