Apache Curator Framework教程(二)Spring Boot实现服务发现服务器(Restful API)
Spring boot: 2.7.8
Curator: 5.0.4
JDK: 17
Spring boot版本不能使用3.x以上,我使用3.0.2测试,不通过,目前还没有研究具体原因,暂时使用2.7.8!
<?xml version="1.0" encoding="UTF-8"?>
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.8
cn.programtalk
curator-service-discovery-server
0.0.1-SNAPSHOT
curator-service-discovery-server
curator-service-discovery-server
17
org.springframework.boot
spring-boot-starter-jersey
org.apache.curator
curator-recipes
5.4.0
org.apache.curator
curator-x-discovery-server
5.4.0
org.apache.curator
curator-test
5.4.0
test
org.springframework.boot
spring-boot-starter-test
test
org.projectlombok
lombok
org.springframework.boot
spring-boot-maven-plugin
需要初始化几个Bean.
package cn.programtalk.config;
import lombok.SneakyThrows;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.x.discovery.ServiceDiscovery;
import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
import org.apache.curator.x.discovery.details.JsonInstanceSerializer;
import org.apache.curator.x.discovery.server.contexts.StringDiscoveryContext;
import org.apache.curator.x.discovery.server.rest.DiscoveryContext;
import org.apache.curator.x.discovery.strategies.RoundRobinStrategy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.ws.rs.ext.ContextResolver;
/**
* Curator配置类
* @author programtalk.cn
*/
@Configuration
public class CuratorConfig {
// zk服务器连接地址,172.29.240.53:2181,172.29.240.53:2182
@Value("${cn.programtalk.zk-servers}")
public String zkServers;
// 服务发现在Zk中的根路径
@Value("${cn.programtalk.base-path}")
public String basePath;
/**
* CuratorFramework客户端
* @return
*/
@Bean
public CuratorFramework curatorFramework() {
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient(zkServers, new ExponentialBackoffRetry(1000, 3));
curatorFramework.start();
return curatorFramework;
}
/**
* ServiceDiscovery实例
* @return
*/
@SneakyThrows
@Bean
ServiceDiscovery serviceDiscovery() {
return ServiceDiscoveryBuilder.builder(String.class)
// zk路径
.basePath(basePath)
// zk客户端
.client(curatorFramework())
// 是否监听实例
.watchInstances(true)
// 序列化
.serializer(new JsonInstanceSerializer<>(String.class))
.build();
}
/**
*
* @return
*/
@Bean
public DiscoveryContext discoveryContext() {
return new StringDiscoveryContext(serviceDiscovery(), new RoundRobinStrategy<>(), 30);
}
@Bean
public ContextResolver> resolver() {
return aClass -> discoveryContext();
}
}
上面这个类,主要配置了CuratorFramework客户端(用于连接Zookeeper),ServiceDiscovery(服务发现配置),DiscoveryContext(服务发现上下文)等.
curator已经实现了Restful Api,他是个抽象类,名字是DiscoveryResource,使用者需要自己创建类并继承DiscoveryResource.
package cn.programtalk.api;
import org.apache.curator.x.discovery.server.rest.DiscoveryContext;
import org.apache.curator.x.discovery.server.rest.DiscoveryResource;
import org.springframework.stereotype.Component;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.ContextResolver;
/**
* 自定义MyResource,继承DiscoveryResource,DiscoveryResource是Curator提供的服务发现服务器的Restful Api.
*/
@Path("/")
@Component
public class MyResource extends DiscoveryResource {
public MyResource(@Context ContextResolver> resolver) {
super(resolver.getContext(DiscoveryContext.class));
}
}
上面创建的MyResource类需要注册到Jersey中.
package cn.programtalk.config;
import cn.programtalk.api.MyResource;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.context.annotation.Configuration;
/**
* Jersey配置类
*
* @author programtalk.cn
*/
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
// 将自定义的Api类注册
register(MyResource.class);
}
}
cn:
programtalk:
# zookeeper服务信息
zk-servers: 172.29.240.53:2181
# 服务发现的根路径(zookeeper中)
base-path: '/service-discovery'
api请求数据结构请看官方说明:https://git-wip-us.apache.org/repos/asf?p=curator.git;a=blob_plain;f=curator-x-discovery-server/README.txt;hb=HEAD
注册或者修改服务
请求数据如下:
PUT /v1/service/product-service/product-instance-id2 HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Content-Length: 224
{
"name": "product-service",
"id": "product-instance-id2",
"address": "10.20.30.40",
"port": 1234,
"payload": "产品服务payload",
"registrationTimeUTC": 1325129459728,
"serviceType": "STATIC"
}
看下Zk里的节点的信息
可以看到product-service服务里有一个实例product-instance-id1
我再添加几个实例(修改id即可)。
总共添加了三个实例。
用同样的方法再添加另一个订单服务(order-service)
PUT /v1/service/order-service/order-instance-id1 HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Content-Length: 220
{
"name": "order-service",
"id": "order-instance-id1",
"address": "10.20.30.40",
"port": 1234,
"payload": "订单服务payload",
"registrationTimeUTC": 1325129459728,
"serviceType": "STATIC"
}
再查看下zk节点情况
也创建了三个实例。
删除服务下的实例
测试删除order-service的order-instance-id1实例
DELETE /v1/service/order-service/order-instance-id1 HTTP/1.1
Host: localhost:8080
查看订单服务信息
确实已经被删除掉。
获取服务下的单个实例
GET /v1/service/order-service/order-instance-id2 HTTP/1.1
Host: localhost:8080
查询所有服务名
GET /v1/service HTTP/1.1
Host: localhost:8080
查询服务下的所有实例
GET /v1/service/order-service HTTP/1.1
Host: localhost:8080
随机获取某个服务下的某个实例
GET /v1/anyservice/order-service HTTP/1.1
Host: localhost:8080
github:https://github.com/ProgramTalk1024/curator-service-discovery-server.git
说明文档
https://itlab1024.com/archives/208.html
如果想运行该项目,首先去application.yaml中修改zk的地址。
页面更新:2024-04-04
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号