Apache Curator Framework教程(二)Spring Boot实现服务发现服务器

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!

项目说明

Maven依赖

<?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(服务发现上下文)等.

API配置

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));
    }
}

注册API类

上面创建的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);
    }
}

application.yaml

cn:
  programtalk:
    # zookeeper服务信息
    zk-servers: 172.29.240.53:2181
    # 服务发现的根路径(zookeeper中)
    base-path: '/service-discovery'

API测试

api请求数据结构请看官方说明:https://git-wip-us.apache.org/repos/asf?p=curator.git;a=blob_plain;f=curator-x-discovery-server/README.txt;hb=HEAD

putService

注册或者修改服务

请求数据如下:

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节点情况

也创建了三个实例。

removeService

删除服务下的实例

测试删除order-service的order-instance-id1实例

DELETE /v1/service/order-service/order-instance-id1 HTTP/1.1
Host: localhost:8080

查看订单服务信息

确实已经被删除掉。

get

获取服务下的单个实例

GET /v1/service/order-service/order-instance-id2 HTTP/1.1
Host: localhost:8080

getAllNames

查询所有服务名

GET /v1/service HTTP/1.1
Host: localhost:8080

getAll

查询服务下的所有实例

GET /v1/service/order-service HTTP/1.1
Host: localhost:8080

getAny

随机获取某个服务下的某个实例

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

标签:发现   服务器   节点   路径   客户端   实例   订单   地址   测试   教程   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top