基于Curator实现dubbo服务自动注册发现

文章目录

  • 概念
  • 基于ServiceDiscovery实现服务自动注册和发现
    • Service:服务基本信息
    • InstanceDetails:封装实例用过来保存到zk中
    • ServiceProvider:服务提供者
    • ServiceConsumer:服务消费者
    • 运行
  • 基于ServiceDiscovery、ServiceCache实现服务自动注册和发现
    • Registry:服务注册Registry接口
    • ZookeeperRegistry:基于zk 实现服务注册发现
    • ServerInfo:注册信息
    • ServiceProviderByCache:服务提供者
    • ServiceComsumerByCache:服务发现者

概念

学习文章:https://blog.csdn.net/qq_34021712/article/details/82887942

基于ServiceDiscovery实现服务自动注册和发现

Service:服务基本信息

package com.demo.rpc.curator;import java.util.List;/***  @author: weijie*  @Date: 2020/9/27 16:32*  @Description: Service:方法、方法描述、方法参数*/
public class Service {private String methodName;private String desc;private List<String> params;public String getMethodName() {return methodName;}public void setMethodName(String methodName) {this.methodName = methodName;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}public List<String> getParams() {return params;}public void setParams(List<String> params) {this.params = params;}
}

InstanceDetails:封装实例用过来保存到zk中

package com.demo.rpc.curator;import java.util.HashMap;
import java.util.Map;public class InstanceDetails {//zk根节点路径public static final String ROOT_PATH = "/service";//该服务拥有哪些方法public Map<String, Service> services = new HashMap<>();//服务描述private String serviceDesc;public InstanceDetails() {}public InstanceDetails(String serviceDesc, Map<String, Service> services) {this.services = services;this.serviceDesc = serviceDesc;}public static String getRootPath() {return ROOT_PATH;}public Map<String, Service> getServices() {return services;}public void setServices(Map<String, Service> services) {this.services = services;}public String getServiceDesc() {return serviceDesc;}public void setServiceDesc(String serviceDesc) {this.serviceDesc = serviceDesc;}
}

ServiceProvider:服务提供者

package com.demo.rpc.curator;import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.x.discovery.*;
import org.apache.curator.x.discovery.details.JsonInstanceSerializer;import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;public class ServiceProvider {public static void main(String[] args) throws Exception {CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181",2000,2000, new ExponentialBackoffRetry(1000, 3));client.start();client.blockUntilConnected();//服务构造器ServiceInstanceBuilder<InstanceDetails> serviceInstanceBuilder = ServiceInstance.builder();//该服务中所有接口Map<String, Service> services = new HashMap<>();Service addOrderService = new Service();addOrderService.setDesc("添加订单");addOrderService.setMethodName("addOrder");addOrderService.setParams(Arrays.asList("uid", "createTime", "sid", "status"));services.put("addOrder", addOrderService);//添加删除订单服务接口Service delOrderService = new Service();delOrderService.setDesc("删除订单");delOrderService.setMethodName("delOrder");delOrderService.setParams(Arrays.asList("sid"));services.put("delOrder", delOrderService);InstanceDetails payload = new InstanceDetails("订单服务", services);//将服务添加到ServiceInstanceServiceInstance<InstanceDetails> orderService = serviceInstanceBuilder.address("127.0.0.1").port(8080).name("OrderService").payload(payload).uriSpec(new UriSpec("{scheme}://{address}:{port}")).build();//构建ServiceDiscovery用来做服务发现ServiceDiscovery<InstanceDetails> serviceDiscovery = ServiceDiscoveryBuilder.builder(InstanceDetails.class).client(client).serializer(new JsonInstanceSerializer<InstanceDetails>(InstanceDetails.class)).basePath(InstanceDetails.ROOT_PATH).build();//服务注册serviceDiscovery.registerService(orderService);serviceDiscovery.start();System.out.println("服务注册成功");//创建钩子方法正常关闭Runtime.getRuntime().addShutdownHook(new Thread(() -> {try {serviceDiscovery.close();client.close();} catch (IOException e) {e.printStackTrace();}System.out.println("shutdown hook...");}));//保持服务运行状态ServiceProvider serviceProvider = new ServiceProvider();synchronized (serviceProvider){serviceProvider.wait();}}}

ServiceConsumer:服务消费者

package com.demo.rpc.curator;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.ServiceInstance;
import org.apache.curator.x.discovery.details.JsonInstanceSerializer;import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;public class ServiceConsumer {public static void main(String[] args) throws Exception {CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));client.start();client.blockUntilConnected();//构建ServiceDiscovery用来做服务发现ServiceDiscovery<InstanceDetails> serviceDiscovery = ServiceDiscoveryBuilder.builder(InstanceDetails.class).client(client).basePath(InstanceDetails.ROOT_PATH).serializer(new JsonInstanceSerializer<InstanceDetails>(InstanceDetails.class)).build();serviceDiscovery.start();//模拟请求调用服务while (true) {Collection<ServiceInstance<InstanceDetails>> orderServices = serviceDiscovery.queryForInstances("OrderService");if (orderServices.size() == 0) {System.out.println("当前没有发现服务");TimeUnit.SECONDS.sleep(10);continue;}for (ServiceInstance<InstanceDetails> service : orderServices) {//获取请求的scheme 例如:http://127.0.0.1:8080String uriSpec = service.buildUriSpec();//获取服务的其他信息InstanceDetails payload = service.getPayload();//服务描述String serviceDesc = payload.getServiceDesc();//获取该服务下的所有接口Map<String, Service> allService = payload.getServices();Set<Map.Entry<String, Service>> entries = allService.entrySet();for (Map.Entry<String, Service> entry : entries) {System.out.println(serviceDesc + uriSpec+ "/" + service.getName()+ "/" + entry.getKey()+ " 该方法需要的参数为:"+ entry.getValue().getParams().toString());}}System.out.println("---------------------");Thread.sleep(5 * 1000);}}}

运行

在这里插入图片描述
在这里插入图片描述

基于ServiceDiscovery、ServiceCache实现服务自动注册和发现

Registry:服务注册Registry接口

package com.demo.rpc.curator;import org.apache.curator.x.discovery.ServiceInstance;import java.util.List;public interface Registry<T> {void registerService(ServiceInstance<T> service) throws Exception;void unRegisterService(ServiceInstance<T> service) throws Exception;List<ServiceInstance<T>> queryForInstances(String name) throws Exception;}

ZookeeperRegistry:基于zk 实现服务注册发现

package com.demo.rpc.curator;import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.x.discovery.ServiceCache;
import org.apache.curator.x.discovery.ServiceDiscovery;
import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
import org.apache.curator.x.discovery.ServiceInstance;
import org.apache.curator.x.discovery.details.InstanceSerializer;
import org.apache.curator.x.discovery.details.JsonInstanceSerializer;import java.util.List;
import java.util.stream.Collectors;public class ZookeeperRegistry<T> implements Registry{private InstanceSerializer serializer = new JsonInstanceSerializer(ServerInfo.class);private ServiceDiscovery<T> serviceDiscovery;private ServiceCache<T> serviceCache;private String ROOT = "/dubbo-demo";private String serviceName = "demoService";private String host;public ZookeeperRegistry(String host) {this.host = host;}public void start() throws Exception{CuratorFramework client = CuratorFrameworkFactory.newClient(this.host, new ExponentialBackoffRetry(1000, 5));client.start();serviceDiscovery = ServiceDiscoveryBuilder.builder(ServerInfo.class).client(client).basePath(ROOT).serializer(serializer).build();serviceDiscovery.start();//监听zk节点信息变化,方便后续的读取serviceCache = serviceDiscovery.serviceCacheBuilder()//多个serviceName如何监听??.name(serviceName).build();serviceDiscovery.start();serviceCache.start();}@Overridepublic void registerService(ServiceInstance service) throws Exception {serviceDiscovery.registerService(service);}@Overridepublic void unRegisterService(ServiceInstance service) throws Exception {serviceDiscovery.unregisterService(service);}/*** @param name* @return 根据name查询缓存数据* @throws Exception*/@Overridepublic List<ServiceInstance> queryForInstances(String name) throws Exception {return serviceCache.getInstances().stream().filter(s -> s.getName().equals(name)).collect(Collectors.toList());}
}

ServerInfo:注册信息

package com.demo.rpc.curator;import java.io.Serializable;public class ServerInfo implements Serializable {private String host;private int port;public ServerInfo() {}public ServerInfo(String host, int port) {this.host = host;this.port = port;}public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}@Overridepublic String toString() {return "ServerInfo{" +"host='" + host + '\'' +", port=" + port +'}';}
}

ServiceProviderByCache:服务提供者

package com.demo.rpc.curator;import org.apache.curator.x.discovery.ServiceInstance;public class ServiceProviderByCache {public static void main(String[] args) throws Exception {ZookeeperRegistry<ServerInfo> zookeeperRegistry = new ZookeeperRegistry<>("127.0.0.1:2181");zookeeperRegistry.start();ServerInfo serverInfo = new ServerInfo("127.0.0.1", 8080);zookeeperRegistry.registerService(ServiceInstance.builder().name("demoService").payload(serverInfo).build());synchronized (ServiceProviderByCache.class){ServiceProviderByCache.class.wait();}}}

ServiceComsumerByCache:服务发现者

package com.demo.rpc.curator;import org.apache.curator.x.discovery.ServiceInstance;import java.util.List;public class ServiceComsumerByCache {public static void main(String[] args) throws Exception {ZookeeperRegistry<ServerInfo> zookeeperRegistry = new ZookeeperRegistry<>("127.0.0.1:2181");zookeeperRegistry.start();//        while (true){List<ServiceInstance> serviceInstances = zookeeperRegistry.queryForInstances("demoService");for (ServiceInstance serviceInstance : serviceInstances){System.out.println(serviceInstance.getPayload().toString());}
//        }}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jdk、cglib动态代理代码示例

文章目录jdk动态代理实现步骤代码示例新建一个接口新建一个接口的实现类新建一个代理类调用测试cglib动态代理实现实现步骤创建一个实现类新建一个代理类调用测试jdk动态代理 实现步骤 新建一个接口新建一个接口的实现类新建一个代理类&#xff0c;实现InvocationHandler接口…

Netty 客户端服务器端通信 demo

服务端 package com.demo.rpc.netty;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioSocketC…

Solr实战篇

1.在MySQL数据中建立lagou_db数据库, 将position.sql中的数据导入到mysql 数据中。 2.使用Solr的DIH 将mysql中的数据导入到Solr中。 3.使用SpringBoot 访问Solr 使用positionName 字段检索职位信息 如果检索到的职位信息不够5条 则需要 启用positionAdvantage 查找 美女多、…

Docker 部署java服务

作业描述&#xff1a; &#xff08;1&#xff09;Hot是应用程序(springboot)&#xff0c;打成jar包&#xff1a;docker-demo-1.0-SNAPSHOT.jar &#xff08;2&#xff09;利用dockerfile将docker-demo-1.0-SNAPSHOT.jar构建成镜像docker-demo Dockerfile-docker-demo&#xf…

单向链表 双向链表 java代码实现

文章目录单向链表代码实现单元测试控制台打印头插法尾插法双向链表代码实现单元测试控制台打印头插法尾插法单向链表 代码实现 package csdn.dreamzuora.list;/*** author: weijie* Date: 2020/10/15 15:28* Description:*/ public class SingleNode {int id;String name…

栈、队列 java代码实现

文章目录普通队列数组实现java代码实现单元测试控制台打印链表实现java代码实现单元测试控制台打印LinkedList队列使用优先队列&#xff1a;PriorityQueue使用栈数组实现java代码实现单元测试控制台打印链表实现java代码实现单元测试控制台打印普通队列 概念&#xff1a;先入先…

ElasticSearch入门篇

文章目录控制台RESTFULL操作REST风格说明基于REST命令说明&#xff1a;es支持的数据类型核心数据类型ik分词器使用ik_smart最少切分ik_max_word最细粒度索引操作索引库创建创建文档方式指定索引类型(以后这种方式会被弃用)不指定索引类型利用默认的_doc类型更新文档方式一&…

【待完成】并发包下常用到线程工具类汇总

文章目录并发容器BlockingQueueArrayBlockingQueueLinkedBlockingQueuePriorityBlockingDelayQueueSynchronousQueueBlockingDequeCopyOnWriteCopyOnWriteArrayListCopyOnWriteArraySetConcurrentLinkedQueue/DequeConcurrentHashMapConcurrentSkipListMap/Set同步工具类AQS实现…

爬虫中如何获取页面编码类型

获取页面的编码格式的三种方式&#xff1a; 根据Response中的header获取编码格式根据页面标签中的meta获取根据页面内容识别自动识别出编码格式&#xff0c;经过测试准确率比较高 三种方式可以结合使用&#xff0c;由于inputStream不能够被复用&#xff0c;但是inputStrem没有…

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…

java核心技术-多线程并发设计原理以及常见面试题

文章目录写在前面多线程回顾Thread和Runnable面试官&#xff1a;为什么我们在项目中推荐使用使用Runnable方法而不用继承Thread&#xff1f;面试官&#xff1a;Callable为什么可以带返回值&#xff0c;你知道底层原理&#xff1f;面试题&#xff1a;线程了解&#xff1f;给我讲…

java核心技术-jvm基础知识

文章目录JVM回顾JVM、JRE、JDK之间关系&#xff1f;Java程序执行过程&#xff1f;面试官&#xff1a;解释执行和JIT(及时编译)两种执行方式有什么区别&#xff1f;java虚拟机内存管理jvm整体架构JVM只是定义内存划分规范等&#xff0c;具体实现依赖不同虚拟机实现&#xff0c;如…

多线程场景下利用ThreadLocal是线程安全?

文章目录背景多线程场景测试代码结论背景 ThreadLocal原理以及基本概念这里我就不介绍了&#xff0c;这里我们主要关注ThreadLocal是否是线程安全吗&#xff1f;其实如果我们知道ThreadLocal原理我们肯定知道它是线程安全的&#xff0c;但是我在开发的时候不放心做了个测试&am…

深入剖析线程池基本原理以及常见面试题详解

文章目录面试官&#xff1a;能给我讲讲线程池的实现原理&#xff1f;线程池类继承关系ThreadPoolExecutor核心数据结构面试官&#xff1a;给我讲讲线程池的有哪些参数&#xff1f;面试官&#xff1a;如何优雅的关闭线程&#xff1f;线程的生命周期面试官&#xff1a;线程池哪五…

设计模式七大设计原则

文章目录设计模式七大设计原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则-最少知道原则单一职责原则合成复用原则设计模式 面向对象的三个基本特征&#xff1a; 继承封装多态 设计模式体现了代码的耦合性、内聚性、可维护性、可扩展性、重用性、灵活性。 代码…

从框架源码中学习结构型设计模式

文章目录从框架源码学习结构型设计模式适配器模式应用实例案例一&#xff1a;dubbo框架日志适配器Logger接口日志实现类Logger适配器接口LoggerAdapter实现类Logger日志工厂桥接模式应用场景案例&#xff1a;dubbo源码-远程调用模块channelHandler设计ChannelHandler是一个SPI拓…

MDC日志logback整合使用

MDC日志logback整合使用 为什么使用MDC记录日志&#xff1f; 场景&#xff1a; 由于我的搜索服务并发量比较高&#xff0c;而处理一次搜索请求需要记录多个日志&#xff0c;因此日志特别多的情况下去查一次搜索整个日志打印情况会比较复杂。 解决方案&#xff1a; 可以使用用…

如何合理的配置线程数?

文章目录题记Java并发编程实战美团技术团队追求参数设置合理性线程池参数动态化题记 我想不管是在面试中、还是工作中&#xff0c;我们总会面临这种问题&#xff0c;那么到底有没有一种计算公式去告诉我们如何去配置呢&#xff1f; 答案是&#xff1a;没有 想要合理的配置线…

基于CompletableFuture并发任务编排实现

文章目录并发任务编排实现不带返回值/参数传递任务串行执行并行执行并行执行-自定义线程池阻塞等待&#xff1a;多并行任务执行完再执行任意一个任务并发执行完就执行下个任务串并行任务依赖场景带返回值/参数传递任务带返回值实现串行执行多线程任务串行执行对任务并行执行&am…

搜索研发工程师需要掌握的一些技能

文章目录基础语言数据结构与算法工程方面搜索相关搜索主要模块电商搜索流程分词相关搜索召回相似度算法相关词推荐排序相关国美搜索搜索算法工程师需要掌握的技能基础 语言 大部分公司用的是Solr、ElasticSearch&#xff0c;都是基于Java实现的&#xff0c;因此熟悉掌握Java语…