ApacheCuratorFramework教程(二)SpringBoot实现服务发现服务器(RestfulAPI)版本说明 Springboot:2。7。8 Curator:5。0。4 JDK:17特别说明 Springboot版本不能使用3。x以上,我使用3。0。2测试,不通过,目前还没有研究具体原因,暂时使用2。7。8!CuratorServiceDiscoveryServer的依赖curatorxdiscoveryserver是基于JAXRS实现的,所以Springboot的web依赖要使用pringbootstarterjersey。curatorxdiscoveryserver已经提供了Restfulapi的代码,我们无需自己写,只需要配置即可。项目说明Maven依赖?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0https:maven。apache。orgxsdmaven4。0。0。xsdmodelVersion4。0。0modelVersionparentgroupIdorg。springframework。bootgroupIdspringbootstarterparentartifactIdversion2。7。8versionrelativePath!lookupparentfromrepositoryparentgroupIdcn。programtalkgroupIdcuratorservicediscoveryserverartifactIdversion0。0。1SNAPSHOTversionnamecuratorservicediscoveryservernamedescriptioncuratorservicediscoveryserverdescriptionpropertiesjava。version17java。versionpropertiesdependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootstarterjerseyartifactIddependency!curator相关依赖dependencygroupIdorg。apache。curatorgroupIdcuratorrecipesartifactIdversion5。4。0versiondependencydependencygroupIdorg。apache。curatorgroupIdcuratorxdiscoveryserverartifactIdversion5。4。0versiondependencydependencygroupIdorg。apache。curatorgroupIdcuratortestartifactIdversion5。4。0versionscopetestscopedependencydependencygroupIdorg。springframework。bootgroupIdspringbootstartertestartifactIdscopetestscopedependencydependencygroupIdorg。projectlombokgroupIdlombokartifactIddependencydependenciesbuildpluginsplugingroupIdorg。springframework。bootgroupIdspringbootmavenpluginartifactIdpluginpluginsbuildproject服务发现服务器配置 需要初始化几个Bean。packagecn。programtalk。importlombok。SneakyTimportorg。apache。curator。framework。CuratorFimportorg。apache。curator。framework。CuratorFrameworkFimportorg。apache。curator。retry。ExponentialBackoffRimportorg。apache。curator。x。discovery。ServiceDimportorg。apache。curator。x。discovery。ServiceDiscoveryBimportorg。apache。curator。x。discovery。details。JsonInstanceSimportorg。apache。curator。x。discovery。server。contexts。StringDiscoveryCimportorg。apache。curator。x。discovery。server。rest。DiscoveryCimportorg。apache。curator。x。discovery。strategies。RoundRobinSimportorg。springframework。beans。factory。annotation。Vimportorg。springframework。context。annotation。Bimportorg。springframework。context。annotation。Cimportjavax。ws。rs。ext。ContextRCurator配置类authorprogramtalk。cnConfigurationpublicclassCuratorConfig{zk服务器连接地址,172。29。240。53:2181,172。29。240。53:2182Value({cn。programtalk。zkservers})publicStringzkS服务发现在Zk中的根路径Value({cn。programtalk。basepath})publicStringbasePCuratorFramework客户端returnBeanpublicCuratorFrameworkcuratorFramework(){CuratorFrameworkcuratorFrameworkCuratorFrameworkFactory。newClient(zkServers,newExponentialBackoffRetry(1000,3));curatorFramework。start();returncuratorF}ServiceDiscovery实例returnSneakyThrowsBeanServiceDiscoveryStringserviceDiscovery(){returnServiceDiscoveryBuilder。builder(String。class)zk路径。basePath(basePath)zk客户端。client(curatorFramework())是否监听实例。watchInstances(true)序列化。serializer(newJsonInstanceSerializer(String。class))。build();}returnBeanpublicDiscoveryContextStringdiscoveryContext(){returnnewStringDiscoveryContext(serviceDiscovery(),newRoundRobinStrategy(),30);}BeanpublicContextResolverDiscoveryContextStringresolver(){returnaClassdiscoveryContext();}} 上面这个类,主要配置了CuratorFramework客户端(用于连接Zookeeper),ServiceDiscovery(服务发现配置),DiscoveryContext(服务发现上下文)等。API配置 curator已经实现了RestfulApi,他是个抽象类,名字是DiscoveryResource,使用者需要自己创建类并继承DiscoveryResource。packagecn。programtalk。importorg。apache。curator。x。discovery。server。rest。DiscoveryCimportorg。apache。curator。x。discovery。server。rest。DiscoveryRimportorg。springframework。stereotype。Cimportjavax。ws。rs。Pimportjavax。ws。rs。core。Cimportjavax。ws。rs。ext。ContextR自定义MyResource,继承DiscoveryResource,DiscoveryResource是Curator提供的服务发现服务器的RestfulApi。Path()ComponentpublicclassMyResourceextendsDiscoveryResourceString{publicMyResource(ContextContextResolverDiscoveryContextStringresolver){super(resolver。getContext(DiscoveryContext。class));}}注册API类 上面创建的MyResource类需要注册到Jersey中。packagecn。programtalk。importcn。programtalk。api。MyRimportorg。glassfish。jersey。server。ResourceCimportorg。springframework。context。annotation。CJersey配置类authorprogramtalk。cnConfigurationpublicclassJerseyConfigextendsResourceConfig{publicJerseyConfig(){将自定义的Api类注册register(MyResource。class);}}application。yamlcn:programtalk:zookeeper服务信息zkservers:172。29。240。53:2181服务发现的根路径(zookeeper中)basepath:servicediscoveryAPI测试 api请求数据结构请看官方说明:https:gitwipus。apache。orgreposasf?pcurator。fcuratorxdiscoveryserverREADME。hbHEADputService 注册或者修改服务 请求数据如下:PUTv1serviceproductserviceproductinstanceid2HTTP1。1Host:localhost:8080ContentType:applicationjsonContentLength:224{name:productservice,id:productinstanceid2,address:10。20。30。40,port:1234,payload:产品服务payload,registrationTimeUTC:1325129459728,serviceType:STATIC} 看下Zk里的节点的信息 可以看到productservice服务里有一个实例productinstanceid1 我再添加几个实例(修改id即可)。 总共添加了三个实例。 用同样的方法再添加另一个订单服务(orderservice)PUTv1serviceorderserviceorderinstanceid1HTTP1。1Host:localhost:8080ContentType:applicationjsonContentLength:220{name:orderservice,id:orderinstanceid1,address:10。20。30。40,port:1234,payload:订单服务payload,registrationTimeUTC:1325129459728,serviceType:STATIC} 再查看下zk节点情况 也创建了三个实例。removeService 删除服务下的实例 测试删除orderservice的orderinstanceid1实例 DELETEv1serviceorderserviceorderinstanceid1HTTP1。1Host:localhost:8080 查看订单服务信息 确实已经被删除掉。get 获取服务下的单个实例 GETv1serviceorderserviceorderinstanceid2HTTP1。1Host:localhost:8080getAllNames 查询所有服务名 GETv1serviceHTTP1。1Host:localhost:8080getAll 查询服务下的所有实例 GETv1serviceorderserviceHTTP1。1Host:localhost:8080getAny 随机获取某个服务下的某个实例 GETv1anyserviceorderserviceHTTP1。1Host:localhost:8080项目地址 github:https:github。comProgramTalk1024curatorservicediscoveryserver。git 说明文档 https:itlab1024。comarchives208。html运行说明 如果想运行该项目,首先去application。yaml中修改zk的地址。