redis作为注册中心
redis registry center
- 下载dubbo源码
- 修改demo
- 运行
- 原理
下载dubbo源码
dubbo可以让redis作为注册中心。
从github上下载dubbo源码。
找到dubbo-registry模块下的dubbo-registry-redis。里面的RedisRegistry类是redis作为注册中心的核心逻辑:
//获得Redis主节点名称String masterName = url.getParameter(REDIS_MASTER_NAME_KEY);if (StringUtils.isEmpty(masterName)) {//单机版redisfor (String address : addresses) {int i = address.indexOf(':');String host;int port;if (i > 0) {host = address.substring(0, i);port = Integer.parseInt(address.substring(i + 1));} else {host = address;port = DEFAULT_REDIS_PORT;}this.jedisPools.put(address, new JedisPool(config, host, port,url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), StringUtils.isEmpty(url.getPassword()) ? null : url.getPassword(),url.getParameter("db.index", 0)));}}
它默认的端口号就是6379。
修改demo
我们找到dubbo-demo下的dubbo-demo-xml。
它默认是用zookeeper作为注册中心的。
我们将dubbo-provider.xml修改为:
<dubbo:application metadata-type="remote" name="demo-provider"/><dubbo:metadata-report address="redis://localhost:6379"/><dubbo:registry protocol="redis" address="localhost:6379" /><bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/><dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
此时的协议是redis协议。
同样的,把dubbo-consumer.xml修改为:
<dubbo:application name="demo-consumer"/><dubbo:metadata-report address="redis://localhost:6379"/><dubbo:registry protocol="redis" address="localhost:6379" /><dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>
并且在上面consumer和provider两个子模块的pom文件中都导入:
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-redis</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-metadata-report-redis</artifactId></dependency>
源码默认是没有redis注册中心依赖和redis数据元依赖的。
导进来后要reimport项目,否则不能生效。
运行
运行provider。
此时redis中就有provider了:

它的元数据:
{"parameters":{"side":"provider","release":"","methods":"sayHello,sayHelloAsync","deprecated":"false","qos.port":"22222","dubbo":"2.0.2","interface":"org.apache.dubbo.demo.DemoService","generic":"false","default":"true","metadata-type":"remote","application":"demo-provider","dynamic":"true","anyhost":"true"},"canonicalName":"org.apache.dubbo.demo.DemoService","codeSource":"file:/Users/aruyi/IdeaProjects/dubbo-master/dubbo-demo/dubbo-demo-interface/target/classes/","methods":[{"name":"sayHello","parameterTypes":["java.lang.String"],"returnType":"java.lang.String"},{"name":"sayHelloAsync","parameterTypes":["java.lang.String"],"returnType":"java.util.concurrent.CompletableFuture"}],"types":[{"type":"int","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"},{"type":"java.lang.Object","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"},{"type":"byte","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"},{"type":"java.util.concurrent.CompletableFuture$Completion","properties":{"next":{"type":"java.util.concurrent.CompletableFuture$Completion","$ref":"java.util.concurrent.CompletableFuture$Completion","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"},"status":{"type":"int","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"}},"typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"},{"type":"java.lang.String","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"},{"type":"java.util.concurrent.CompletableFuture","properties":{"result":{"type":"java.lang.Object","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"},"stack":{"type":"java.util.concurrent.CompletableFuture$Completion","properties":{"next":{"type":"java.util.concurrent.CompletableFuture$Completion","$ref":"java.util.concurrent.CompletableFuture$Completion","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"},"status":{"type":"int","typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"}},"typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"}},"typeBuilderName":"org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder"}]
}
运行consumer:
public class Application {/*** In order to make sure multicast registry works, need to specify '-Djava.net.preferIPv4Stack=true' before* launch the application*/public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml");context.start();DemoService demoService = context.getBean("demoService", DemoService.class);System.err.println(demoService.sayHello("ocean"));CompletableFuture<String> hello = demoService.sayHelloAsync("world");System.err.println("result: " + hello.get());}
}
控制台上,它成功调用了远程的方法:

我们也可以看到redis中有consumer的注册。
它的元数据:
{"init":"false","side":"consumer","metadatatype":"remote","application":"demo-consumer","release":"","methods":"sayHello,sayHelloAsync","qos.port":"33333","sticky":"false","dubbo":"2.0.2","check":"false","interface":"org.apache.dubbo.demo.DemoService"
}
原理

这是官网的截图。
可以看到,它是基于redis的事件发布和订阅的。monitor用于监视各种事件的变化。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
