注册中心--Eureka

devtools/2024/10/21 4:45:11/

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:Spring Cloud实战
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

1.项目问题

2.解决URL问题 

2.1解决思路 

2.2注册中心

2.3 CAP理论

3.Eureka

3.1搭建Eureka Server

​4.服务注册


1.项目问题

  1. url是写死的,如果IP地址发生变化,需要修改代码;
  2. 如果多机部署,怎么处理?
  3. 返回结果如何共用,url非常容易写错; 

2.解决URL问题 

当更换机器,或者新增机器时,这个URL就需要跟着变更,就需要去通知所有的相关服务去修改.

2.1解决思路 

试想⽣活中的场景:
我们⽣活中,避免不了和各个机构(医院,学校,政府部⻔等)打交道,就需要保存各个机构的电话号码.如果机构换了电话号码,就需要通知各个使⽤⽅,但是这些机构的使⽤⽅群体是巨⼤的,没办法做到⼀⼀通知,怎么处理呢?

机构电话如果发⽣变化,通知114.⽤⼾需要联系机构时,先打114查询电话,然后再联系各个机构.
114查号台的作⽤主要有两个:
号码注册:服务⽅把电话上报给114.
号码查询:使⽤⽅通过114可以查到对应的号码.

 同样的,微服务开发时,也可以采⽤类似的⽅案.
服务启动/变更时,向注册中⼼报道.注册中⼼记录应⽤和IP的关系.
调⽤⽅调⽤时,先去注册中⼼获取服务⽅的IP,再去服务⽅进⾏调⽤.

2.2注册中心

注册中⼼主要有三种⻆⾊:

  • 服务提供者(Server):⼀次业务中,被其它微服务调⽤的服务.也就是提供接⼝给其它微服务.
  • 服务消费者(Client):⼀次业务中,调⽤其它微服务的服务.也就是调⽤其它微服务提供的接⼝.
  • 服务注册中⼼(Registry):⽤于保存Server的注册信息,当Server节点发⽣变更时,Registry会同步变更.服务与注册中⼼使⽤⼀定机制通信,如果注册中⼼与某服务⻓时间⽆法通信,就会注销该实例.

 服务提供者和服务消费者是相对的.

 服务注册:服务提供者在启动时,向Registry注册⾃⾝服务,并向Registry定期发送⼼跳汇报存活状态.
服务发现服务消费者从注册中⼼查询服务提供者的地址,并通过该地址调⽤服务提供者的接⼝.服务发现的⼀个重要作⽤就是提供给服务消费者⼀个可⽤的服务列表.

2.3 CAP理论

谈到注册中⼼,就避不开CAP理论.
CAP理论是分布式系统设计中最基础,也是最为关键的理论.

  • ⼀致性(Consistency):CAP理论中的⼀致性,指的是强⼀致性.所有节点在同⼀时间具有相同的数据.
  • 可⽤性(Availability):保证每个请求都有响应(响应结果可能不对)
  • 分区容错性(Partition Tolerance):当出现⽹络分区后,系统仍然能够对外提供服务.

以生活中的场景举例:银行利率下调,这个通知需要下发到各个银行的工作人员.

一致性:所有的银行工作人员,对客户讲的利率都是一样的.

可用性:不论何时,银行人员对客户咨询利率的请求,都是有答案的.(答案可能是旧的)

分区容错性:如果一个工作人员请假了,银行依然可以对外提供服务.

P是必须要保证的,所以C和A只能选一个.我们的架构就是CP架构或者AP架构。

CP架构:为了保证分布式系统对外的数据⼀致性,于是选择不返回任何数据
AP架构:为了保证分布式系统的可⽤性,节点返回旧版本的数据(即使这个数据不正确)

3.Eureka

 Eureka是Netflix OSS套件中关于服务注册和发现的解决⽅案.Spring Cloud对ureka进⾏了集成,并作为优先推荐⽅案进⾏宣传,虽然⽬前Eureka 2.0已经停⽌维护,新的微服务架构设计中,也不再建议使⽤,但是⽬前依然有⼤量公司的微服务系统使⽤Eureka作为注册中⼼.

官⽅⽂档:https://github.com/Netflix/eureka/wiki
 Eureka的学习,主要包含以下三个部分:

  1.  搭建Eureka Server
  2. 将order-service,product-service都注册到Eureka
  3. order-service远程调⽤时,从Eureka中获取product-service的服务列表,然后进⾏交互

3.1搭建Eureka Server

创建Eureka-server⼦模块

引⼊eureka-server依赖

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>

项目构建插件 

    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

 编写配置文件

server:port: 10010  
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为falseregister-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.service-url:# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

完善启动类 

给该项⽬编写⼀个启动类,并在启动类上添加 @EnableEurekaServer 注解,开启eureka注册中⼼服务.

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

启动服务 

可以看到eureka-server已经启动成功了. 


4.服务注册

 把product-service,order-service注册到eureka-server中

引入eureka-client依赖到product-service,order-service中的pom文件

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

完善product-service,order-service中配置⽂件

spring:application:name: product-service
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka

启动product-service服务 

可以看到product-service已经注册到eureka上了.

 远程调用

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;public OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
//        String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();//根据应用名获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");//获取第一个服务
//        EurekaServiceInstance serviceInstance = (EurekaServiceInstance)instances.get(0);//拼接urlString url = instances.get(0).getUri() + "/product/" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

启动测试

刷新注册中⼼,可以看到order-service已经注册到eureka上了

访问接⼝:http://127.0.0.1:8080/order/1
可以看到,远程调⽤也成功了.


http://www.ppmy.cn/devtools/87695.html

相关文章

云时代的运维工程师还有用吗?

今天谈一谈下面几个问题&#xff1a; 云时代的运维工程师还有用吗&#xff1f; 公有云提供了大量开箱即用的服务&#xff0c;运维还能做什么&#xff1f; 公有云时代&#xff0c;运维工程师需要什么技能&#xff1f; 1. 云时代的运维工程师还有用吗&#xff1f; 看看招聘情况…

RK3568笔记四十九:W25Q64驱动开发(硬件SPI1)

若该文为原创文章&#xff0c;转载请注明原文出处。 一、SPI介绍 串行外设接口 (Serial Peripheral interface) 简称 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并 且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚。 …

2024河南萌新联赛第(三)场 河南大学

B. 正则表达式 题目&#xff1a; https://ac.nowcoder.com/acm/contest/87865/B 给出n个地址&#xff0c;每个地址的形式为x.x.x.x&#xff0c;找四个x都满足x>0&&x<255的个数 思路&#xff1a; 首先定义四个数组和一个字符&#xff0c;然后按题目所给的形式…

前端日历插件VCalendar

官网地址 API | VCalendar 1.安装 yarn add v-calendarnext popperjs/core 2.全局引入 mian.js //日历插件 import VCalendar from v-calendar; import v-calendar/style.css;app.use(VCalendar); 3.使用 <div><VCalendar reservationTime expanded borderless…

NLP-使用Word2vec实现文本分类

Word2Vec模型通过学习大量文本数据&#xff0c;将每个单词表示为一个连续的向量&#xff0c;这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text&#xff0c;预测其文本标签label。以下使用mock商品数据的代码实现过程过下&#xff1a; 1、…

大语言模型稀疏水印技术

面对大型语言模型&#xff08;LLMs&#xff09;在假新闻制造与作弊方面的潜在风险&#xff0c;研究者提出了稀疏水印&#xff08;Sparse Watermark&#xff09;——种创新的文本水印技术&#xff0c;旨在监测和追溯LLMs生成的内容。不同于传统水印方法在可检测性与文本质量间的…

git分支操作

date: 2024-08-01 18:14:54 tags: vue3 在Git中更改本地分支可以通过以下几种方式&#xff1a; 1. 切换分支 如果你想切换到一个已存在的分支&#xff0c;可以使用以下命令&#xff1a; git checkout <分支名称>例如&#xff0c;如果你想切换到名为feature-branch的分…

前端小白安装node、vue、Express、Electron及(Electron桌面端exe应用开发)

一、node.js &#xff08;一&#xff09;、下载 下载地址 Node.js — 在任何地方运行 JavaScript (nodejs.org) 参考文章&#xff1a;Node.js安装及环境配置超详细教程【Windows系统】_windows 安装nodejs-CSDN博客 &#xff08;二&#xff09;、安装 安装路径可以更换&a…