文章目录Ⅰ. 背景一、问题描述二、注册中心三、CAP理论四、常见的注册中心① Zookeeper② Eureka③ NacosCAP对比Ⅱ. Eureka介绍Ⅲ. 搭建EurekaServer一、创建Eureka-server子模块二、引入eureka-server依赖三、添加maven项目构建插件四、完善启动类五、编写配置文件六、启动服务Ⅳ. 服务注册一、引入eureka-client依赖二、完善配置文件三、启动服务Ⅴ. 服务发现一、引入依赖二、完善配置文件三、远程调用四、启动服务Ⅵ. Eureka和Zookeeper区别Ⅰ. 背景一、问题描述上个章节的例子中可以看到远程调用时我们的 URL 是写死的Stringurlhttp://127.0.0.1:9090/product/orderInfo.getProductId();当更换机器或者新增机器时这个 URL 就需要跟着变更就需要去通知所有的相关服务去修改。随之而来的就是各个项目的配置文件反复更新各个项目的频繁部署。这种没有具体意义但又不得不做的工作会让人非常痛苦。二、注册中心注册中心Service Registry / Service Discovery Center是微服务架构中一个核心组件用来管理和维护服务实例的“地址簿”。它的核心作用是让服务能够动态发现其他服务的位置而不依赖固定的 IP 或端口。注册中心主要有三种角色服务提供者Server一次业务中被其它微服务调用的服务。也就是提供接口给其它微服务。服务消费者Client一次业务中调用其它微服务的服务。也就是调用其它微服务提供的接口。服务注册中心Registry用于保存 Server 的注册信息当 Server 节点发生变更时Registry 会同步变更。服务与注册中心使用一定机制通信如果注册中心与某服务长时间无法通信就会注销该实例。注册中心主要负责两件事服务注册Service Registration当一个服务实例启动时它会把自己的信息服务名、IP、端口、健康状态等注册到注册中心。示例服务 A 启动 → 向注册中心注册自己为A:IP:PORT。服务发现Service Discovery当一个服务需要调用另一个服务时它不再去找固定 IP而是向注册中心查询目标服务的可用实例列表。示例服务 B 需要调用服务 A → 查询注册中心 → 获取 A 的可用实例 → 调用。健康检查Health Check可选注册中心通常会定期检查服务实例的状态发现异常则剔除保证服务调用可靠性。三、CAP理论CAP 理论是分布式系统设计中最基础也是最为关键的理论。一致性ConsistencyCAP 理论中的一致性指的是强一致性即所有节点在同一时间具有相同的数据。可用性Availability保证每个请求都有响应但是响应结果可能是旧的。分区容错性Partition Tolerance当出现网络分区后系统仍然能够对外提供服务。一个分布式系统不可能同时满足数据一致性服务可用性和分区容错性这三个基本需求最多只能同时满足其中的两个。在分布式系统中系统间的网络不能 100% 保证健康服务又必须对外保证服务因此 Partition Tolerance 不可避免那就只能在 Consistency 和 Availability 中选择一个也就是 CP 或者 AP 架构。CP架构为了保证分布式系统对外的数据一致性可能选择不返回任何数据AP架构为了保证分布式系统的可用性即使这个数据不正确更多参考https://cloud.tencent.com/developer/article/1860632四、常见的注册中心① ZookeeperZookeeper 的官方并没有说它是一个注册中心但是国内 Java 体系大部分的集群环境都是依赖 Zookeeper 来完成注册中心的功能。② EurekaEureka 是 Netflix 开发的基于 REST 的服务发现框架主要用于服务注册、管理、负载均衡和服务故障转移。官方声明在 Eureka2.0 版本停止维护不建议使用。但是 Eureka 是 SpringCloud 服务注册/发现的默认实现所以目前还是有很多公司在使用。③ NacosNacos 是 SpringCloudAlibaba 架构中重要的组件除了服务注册服务发现功能之外Nacos 还支持配置管理、流量管理、DNS、动态DNS等多种特性。CAP对比ZookeeperEurekaNacosCAP理论CPAPCP或AP (默认AP)在分布式环境中即使拿到一个错误的数据也胜过无法提供实例信息而造成请求失败要好比如淘宝双十一、京东618都是谨遵AP原则。Ⅱ. Eureka介绍Eureka 是 NetflixOSS 套件中关于服务注册和发现的解决方案。SpringCloud 对 Eureka 进行了集成并作为优先推荐方案进行宣传虽然目前 Eureka2.0 已经停止维护新的微服务架构设计中也不再建议使用但是目前依然有大量公司的微服务系统使用 Eureka 作为注册中心。官方文档https://github.com/Netflix/eureka/wikiEureka主要分为两个部分EurekaServer作为注册中心 Server 端向微服务应用程序提供服务注册、服务发现、健康检查等功能。EurekaClient服务提供者服务启动时会向EurekaServer注册自己的信息IP、端口、服务信息等信息然后EurekaServer会存储这些信息。通常Eureka-server作为一个独立的微服务Ⅲ. 搭建EurekaServer一、创建Eureka-server子模块二、引入eureka-server依赖dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId/dependency三、添加maven项目构建插件buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build四、完善启动类给该项目编写一个启动类并在启动类上添加EnableEurekaServer注解开启 eureka 注册中心服务。importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;EnableEurekaServerSpringBootApplicationpublicclassEurekaServerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EurekaServerApplication.class,args);}}五、编写配置文件server:port:10010spring:application:name:eureka-servereureka: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/六、启动服务启动服务访问注册中心:http://127.0.0.1:10010/可以看到 eureka-server 已经启动成功了。Ⅳ. 服务注册接下来将之前的product-service注册到eureka-server中。一、引入eureka-client依赖dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency二、完善配置文件添加服务名称和 eureka 的地址spring:application:name:product-serviceeureka:client:service-url:defaultZone:http://127.0.0.1:10010/eureka三、启动服务刷新注册中心http://127.0.0.1:10010/可以看到 product-service 已经注册到 eureka 上了Ⅴ. 服务发现接下来修改order-service在远程调用时从eureka-server拉取product-service的服务信息实现服务发现。一、引入依赖服务注册和服务发现都封装在 eureka-client 依赖中所以服务发现时也是引入 eureka-client 依赖。dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency二、完善配置文件服务发现也需要知道 eureka 地址因此配置内容依然与服务注册一致都是配置 eureka 信息。spring:application:name:order-serviceeureka:client:service-url:defaultZone:http://127.0.0.1:10010/eureka三、远程调用远程调用时我们需要从 eureka-server 中获取 product-service 的列表可能存在多个服务并选择其中一个进行调用。所有微服务要从注册中心如 Eureka、Consul、Nacos拉取服务实例信息靠的就是DiscoveryClient。Slf4jServicepublicclassOrderService{AutowiredprivateOrderMapperorderMapper;ResourceprivateDiscoveryClientdiscoveryClient;AutowiredprivateRestTemplaterestTemplate;publicOrderInfoselectOrderById(IntegerorderId){OrderInfoorderInfoorderMapper.selectOrderById(orderId);//String url http://127.0.0.1:9090/product/ orderInfo.getProductId();// 根据应用名称获取服务列表ListServiceInstanceinstancesdiscoveryClient.getInstances(product-service);// 服务可能有多个, 获取第一个EurekaServiceInstanceinstance(EurekaServiceInstance)instances.get(0);log.info(instance.getInstanceId());// 拼接urlStringurlinstance.getUri()/product/orderInfo.getProductId();ProductInfoproductInforestTemplate.getForObject(url,ProductInfo.class);orderInfo.setProductInfo(productInfo);returnorderInfo;}}四、启动服务刷新注册中心http://127.0.0.1:10010/可以看到 order-service 已经注册到 eureka 上了。访问接口:http://127.0.0.1:8080/order/1可以看到远程调用也成功了。Ⅵ. Eureka和Zookeeper区别Eureka 和 Zookeeper 都是用于服务注册和发现的工具区别如下Eureka 是 Netflix 开源的项目而 Zookeeper 是 Apache 开源的项目。Eureka 基于AP原则保证高可用而 Zookeeper 基于CP原则保证数据一致性。Eureka 每个节点都是均等的而 Zookeeper 的节点区分 Leader 和 Follower/Observer也正因为这个原因如果 Zookeeper 的 Leader 发生故障时需要重新选举选举过程集群会有短暂时间的不可用。