注册中心--Eureka

server/2024/10/11 5:44:53/

  • 🎥 个人主页: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/server/93525.html

相关文章

【个人亲试最新】WSL2中的Ubuntu 22.04安装Docker

文章目录 Wsl2中的Ubuntu22.04安装Docker报错解决完全卸载Docker参考博客 &#x1f60a;点此到文末惊喜↩︎ Wsl2中的Ubuntu22.04安装Docker 友情提示&#xff1a;确定为wsl2ubuntu22.04&#xff0c;若按照以下步骤失败&#xff0c;请完全卸载后重装docker&#xff0c;并检查ws…

jdk1.8中HashMap为什么不直接用红黑树

最开始使用链表的时候&#xff0c;空间占用比较少&#xff0c;而且由于链表短&#xff0c;所以查询时间也没有太大的问题。可是当链表越来越长&#xff0c;需要用红黑树的形式来保证查询的效率。 参考资料&#xff1a; https://blog.51cto.com/u_13294304/3075723

抖音短视频矩阵管理系统:短视频运营的得力助手

1. 抖音短视频矩阵管理系统介绍 随着短视频行业的迅速发展&#xff0c;越来越多的企业和自媒体人开始关注短视频运营。抖音作为国内最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户群体和丰富的内容资源。为了更好地管理和运营短视频&#xff0c;抖音短视频矩阵管理系统应…

uniapp手写滚动选择器

文章目录 效果展示HTML/Template部分&#xff1a;JavaScript部分&#xff1a;CSS部分&#xff1a;完整代码 没有符合项目要求的选择器 就手写了一个 效果展示 实现一个时间选择器的功能&#xff0c;可以选择小时和分钟&#xff1a; HTML/Template部分&#xff1a; <picker…

【算法】动态规划-斐波那契数列模型

目录 1、第N个泰波那契数 1.1 算法原理讲解 1.1.1 状态表示 1.1.2 状态转移方程 1.1.3 初始化 1.1.4 填表顺序 1.1.5 返回值 1.2 代码实现 1.3 空间优化 2、三步问题 2.1 算法原理讲解 2.1.1 状态表示 2.1.2 状态转移方程 2.1.3 初始化 2.1.4 填表顺序 2.1.5 返…

C端与B端 - 第一弹 - 理解和区分C端与B端软件开发

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 在软件开发领域…

环境如何搭建部署Nacos

这里我使用的是Centos7&#xff0c; Nacos 依赖 Java环境来运行。如果您是从代码开始构建并运行Nacos&#xff0c;还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用 ## 1、下载安装JDK wget https://download.oracle.com/java/17/latest/jdk-17_linux-x6…

2024.7.19 作业

1.链表的排序 int list_sort(NodePtr L) {if(NULLL || L->len<1){printf("排序失败");return -1;}int lenL->len1;NodePtr p;int i,j;for( i1;i<len;i){for( j0,pL;j<len-i;j,pp->next){if( p->data > p->next->data ){datatype tp-&…