SpringCloud-服务注册-Eureka

📅 发布时间:2026/7/11 10:31:12
SpringCloud-服务注册-Eureka Eureka一、定义1、概念​ Eureka是Netflix开发的服务发现框架本身是一个基于REST的服务主要用于定位运行在AWS域中的中间层服务以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中以实现SpringCloud的服务发现功能。Eureka是AP模式保证可用性和分区容错性2、组成Eureka包含两个组件Eureka Server和Eureka Client。Eureka Server提供服务注册服务各个节点启动后会在Eureka Server中进行注册这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息服务节点的信息可以在界面中直观的看到。Eureka Client是一个java客户端用于简化与Eureka Server的交互客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后Eureka Client将会向Eureka Server发送心跳,默认周期为30秒如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。3、数据同步Eureka Server之间通过复制的方式完成数据的同步Eureka还提供了客户端缓存机制即使所有的Eureka Server都挂掉客户端依然可以利用缓存中的信息消费其他服务的API。综上Eureka通过心跳检查、客户端缓存等机制确保了系统的高可用性、灵活性和可伸缩性。4、自我保护机制在默认配置中Eureka Server在默认90s没有得到客户端的心跳则注销该实例但是往往因为微服务跨进程调用网络通信往往会面临着各种问题比如微服务状态正常但是因为网络分区故障时Eureka Server注销服务实例则会让大部分微服务不可用这很危险因为服务明明没有问题。为了解决这个问题Eureka 有自我保护机制通过在Eureka Server配置如下参数可启动保护机制eureka.server.enable-self-preservationtrue它的原理是当Eureka Server节点在短时间内丢失过多的客户端时可能发送了网络故障那么这个节点将进入自我保护模式不再注销任何微服务当网络故障回复后该节点会自动退出自我保护模式。自我保护模式的架构哲学是宁可放过一个决不可错杀一千二、实践springcloud1、Eureka服务端1、引入jar包dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId/dependency2、yml配置server:port:7001eureka:instance:hostname:eureka7001.com#服务器实例名,因为搭建集群所以做了域名映射client:#false表示不向注册中心注册自己register-with-eureka:false#false表示我就是注册中心我的职责就是维护服务实例并不需要去检索服务fetch-registry:falseservice-url:#设置Eureka Server 交互的地址查询服务和注册服务都需要依赖这个的地址defaultZone:http://eureka7002.com:7002/eureka/# server:# #关闭自我保护机制保证不可用就及时删除掉# enable-self-preservation: false# eviction-interval-timer-in-ms: 2000server:port:7002eureka:instance:hostname:eureka7002.com#服务器实例名client:#false表示不向注册中心注册自己register-with-eureka:false#false表示我就是注册中心我的职责就是维护服务实例并不需要去检索服务fetch-registry:falseservice-url:#设置Eureka Server 交互的地址查询服务和注册服务都需要依赖这个的地址defaultZone:http://eureka7001.com:7001/eureka/3、启动类SpringBootApplicationEnableEurekaServer//启动Eureka服务publicclassEurekaMain7002{publicstaticvoidmain(String[]args){SpringApplication.run(EurekaMain7002.class,args);}}2、Eureka客户端1、jar包dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency2、ymlserver:port:8001spring:application:name:cloud-payment-servicedatasource:type:com.alibaba.druid.pool.DruidDataSourceusername:rootpassword:1706031120driver-class-name:com.mysql.jdbc.Driverurl:jdbc:mysql://localhost:3306/cloud?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneUTCmybatis:mapper-locations:classpath:mapper/*.xmltype-aliases-package:com.zpc.springcloud.pojoeureka:client:#是否将自己注册到Eureka Server服务中心里register-with-eureka:true#是否从EurekaServer中抓取已有的注册信息单点无所谓但集群必须设置为true才能配合Ribbon使用负载均衡fetch-registry:trueservice-url:#defaultZone: http://localhost:7001/eureka #单机版defaultZone:http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka#集群版instance:instance-id:payment8001prefer-ip-address:true#Eureka客户端向服务端发送心跳的时间间隔单位秒#lease-renewal-interval-in-seconds: 2#Eureka服务端在收到最后一次心跳后等待的时间上限单位秒超时将剔除服务#lease-expiration-duration-in-seconds: 2注其它yml类似3、启动类SpringBootApplicationEnableEurekaClient//启动Eureka客户端 也可发现服务EnableDiscoveryClient//启动服务发现客户端publicclassPaymentMain8001{publicstaticvoidmain(String[]args){SpringApplication.run(PaymentMain8001.class,args);}}注EnableDiscoveryClient和EnableEurekaClient共同点都是能够让注册中心能够发现扫描到改服务。不同点EnableEurekaClient只适用于Eureka作为注册中心EnableDiscoveryClient可以是其他注册中心。4、业务类目录结构[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0w7ug53-1606724865578)(https://t-images-1304141946.cos.ap-hongkong.myqcloud.com/blog/image-20201128212300653.png)]controller类Slf4jRestControllerpublicclassPaymentController{/* *通过实例化discoveryClient *可以获得调用的服务一些信息 *getServices() 获得注册在注册中心的服务 *getInstances(String Service) 实例化服务 */ResourceprivateDiscoveryClientdiscoveryClient;ResourceprivatePaymentServicepaymentService;Value(${server.port})privateStringserverPort;PostMapping(/payment/create)publicCommetResultcreate(RequestBodyPaymentpayment){intresultpaymentService.create(payment);log.info(进入创建);if(result0){returnnewCommetResult(200,创建成功,服务端口serverPort,result);}else{returnnewCommetResult(444,创建失败,服务端口serverPort,result);}}GetMapping(/payment/query/{id})publicCommetResultqueryById(PathVariable(id)Longid){log.info(进入查询);PaymentresultpaymentService.getPaymentById(id);if(result!null){returnnewCommetResult(200,查询成功,服务端口serverPort,result);}else{returnnewCommetResult(444,查询失败服务端口serverPort,result);}}GetMapping(/payment/discovery)publicDiscoveryClientdiscovery(){CollectionStringservicesdiscoveryClient.getServices();for(Stringservice:services){log.info(##########service);}CollectionServiceInstanceinstancesdiscoveryClient.getInstances(CLOUD-PAYMENT-SERVICE);for(ServiceInstanceinstance:instances){log.info(**********instance.getHost()\tinstance.getServiceId()\tinstance.getPort());}returndiscoveryClient;}}sql数据库SETFOREIGN_KEY_CHECKS0;-- ------------------------------ Table structure for payment-- ----------------------------DROPTABLEIFEXISTSpayment;CREATETABLEpayment(idbigint(20)NOTNULLAUTO_INCREMENTCOMMENT主键,serialvarchar(200)DEFAULTNULLCOMMENT支付流水号,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBAUTO_INCREMENT3DEFAULTCHARSETutf8 ROW_FORMATDYNAMICCOMMENT支付表;http://eureka7002.com:7002/http://eureka7001.com:7001/三、调用结构