2026/1/24 9:57:23
网站建设
项目流程
asp网站 证书,防止访问网站文件夹,建网站做seo,阿里云部署一个自己做的网站目录一、服务注册引入二、 服务注册中心三、 CAP理论四、 常见注册中心五、 Eureka5.1 搭建注册中心5.2 服务注册5.3 服务发现一、服务注册引入
在上一篇环境与工程搭建#xff0c;我们远程调用时候写url写死了。
String url http://127.0.0.1:9090/product/ o…目录一、服务注册引入二、 服务注册中心三、 CAP理论四、 常见注册中心五、 Eureka5.1 搭建注册中心5.2 服务注册5.3 服务发现一、服务注册引入在上一篇环境与工程搭建我们远程调用时候写url写死了。Stringurlhttp://127.0.0.1:9090/product/orderInfo.getProductId();当更换服务器的时候这个url是需要跟着变的。我们这里就需要使用注册中心来解决这个问题。二、 服务注册中心注册中心维护⼀个服务列表哪个机器上线了哪个机器宕机了这些信息都会⾃动更新到服务列表上客⼾端拿到这个列表直接进⾏服务调⽤即可。这个就是注册中⼼注册中⼼主要有三种⻆⾊以租房为例服务提供者(Server)⼀次业务中被其它微服务调⽤的服务。也就是提供接⼝给其它微服务。相当于房东服务消费者(Client)⼀次业务中调⽤其它微服务的服务。也就是调⽤其它微服务提供的接⼝。相当于租客服务注册中⼼(Registry)⽤于保存Server 的注册信息当Server 节点发⽣变更时Registry 会同步变更。服务与注册中⼼使⽤⼀定机制通信如果注册中⼼与某服务⻓时间⽆法通信就会注销该实例。相当于中介关系与工作内容服务注册服务提供者在启动时向 Registry 注册⾃⾝服务并向 Registry 定期发送⼼跳汇报存活状态。服务发现服务消费者从注册中⼼查询服务提供者的地址并通过该地址调⽤服务提供者的接⼝。服务发现的⼀个重要作⽤就是提供给服务消费者⼀个可⽤的服务列表。三、 CAP理论一致性(Consistency) CAP理论中的⼀致性, 指的是强⼀致性所有节点在同⼀时间对外具有相同的数据。弱一致性就是所有节点对外达到相同数据可以有时间间隔可⽤性(Availability)保证每个请求都有响应(响应结果可能不对)分区容错性(Partition Tolerance)当出现⽹络分区后系统仍然能够对外提供服务分布式系统CAP三个属性是不可能同时满足的系统间的⽹络又不能100%保证健康服务⼜必须对外保证服务因此Partition Tolerance分区容错性不可避免。那就只能在C和A中选择⼀个。也就是CP或者AP架构。CP架构为了保证分布式系统对外的数据⼀致性于是选择不返回任何数据AP架构为了保证分布式系统的可⽤性节点间可能返回不同版本的数据(即使这个数据不正确)四、 常见注册中心ZookeeperZookeeper的官⽅并没有说它是⼀个注册中⼼但是国内Java体系⼤部分的集群环境都是依赖 Zookeeper来完成注册中⼼的功能。EurekaEureka是Netflix开发的基于REST的服务发现框架主要⽤于服务注册管理负载均衡和服务故障转移。官⽅声明在Eureka2.0版本停⽌维护不建议使⽤。但是Eureka是SpringCloud服务注册/发现的默认实现所以⽬前还是有很多公司在使⽤。NacosNacos是Spring Cloud Alibaba架构中重要的组件除了服务注册服务发现功能之外Nacos还⽀持配置管理流量管理DNS动态DNS等多种特性。五、 EurekaEureka主要分为两个部分Eureka Server作为注册中⼼Server端向微服务应⽤程序提供服务注册发现健康检查等能⼒。Eureka Client服务提供者服务启动时会向Eureka Server 注册⾃⼰的信息(IP,端⼝,服务信息等)Eureka Server 会存储这些信息。5.1 搭建注册中心我们就使用上一篇文章环境与工程搭建的案例代码来搭建。创建Eureka-server ⼦模块pom中引⼊eureka-server依赖与项目构建插件!-- eureka-server依赖 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId/dependency!-- 项目构建插件 --buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build完善启动类packagecom.cloud.eureka;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.server.EnableEurekaServer;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/启动服务访问注册中心5.2 服务注册把product-service 注册到eureka-server中。在product-service的pom文件中加上eureka-client的依赖dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency完善product-service的配置⽂件spring:application:name:product-serviceeureka:client:service-url:defaultZone:http://127.0.0.1:10010/eureka启动服务5.3 服务发现修改order-service在远程调⽤时从eureka-server拉取product-service的服务信息实现服务发现在order-service的pom文件中加上eureka-client的依赖dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency完善order-service的配置⽂件spring:application:name:order-serviceeureka:client:service-url:defaultZone:http://127.0.0.1:10010/eureka远程调⽤修改servicepackagecom.cloud.order.service;importcom.cloud.order.mapper.OrderMapper;importcom.cloud.order.model.OrderInfo;importcom.cloud.order.model.ProductInfo;importjakarta.annotation.Resource;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cloud.client.ServiceInstance;importorg.springframework.cloud.client.discovery.DiscoveryClient;importorg.springframework.cloud.netflix.eureka.EurekaServiceInstance;importorg.springframework.stereotype.Service;importorg.springframework.web.client.RestTemplate;importjava.util.List;ServiceSlf4jpublicclassOrderService{AutowiredprivateOrderMapperorderMapper;AutowiredprivateRestTemplaterestTemplate;ResourceprivateDiscoveryClientdiscoveryClient;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;}}启动