当前位置: 首页 > 后端技术 > Java

Dubbo入门系列快速部署微服务应用

时间:2023-04-01 23:10:49 Java

本文将演示如何基于DubboSamples快速构建和部署微服务应用。背景Dubbo是一个微服务框架,最重要的是为用户提供跨进程的RPC远程调用能力。如上图所示,Dubbo的服务消费者(Consumer)通过一系列的任务向服务提供者(Provider)发送请求。为了实现这样的目标,Dubbo引入了Registry组件。通过Registry,服务消费者可以感知服务提供者的连接方式,从而将请求发送给正确的服务提供者。目标了解微服务的调用方式和Dubbo的能力难度低环境要求系统:Windows、Linux、MacOSJDK8及以上版本(推荐JDK17)GitDocker(可选)动手实践本章将一步步教你通过一个fewsimplecommands如何部署和运行一个最简单的Dubbo用例。1.获取测试项目在开始整个教程之前,我们需要获取测试项目的代码。Dubbo的所有测试用例代码都存放在apache/dubbo-samples仓库中。以下命令可以帮助您获取示例存储库中的所有代码。gitclone--depth=1--branchmastergit@github.com:apache/dubbo-samples.git2。了解DubboSamples的项目结构在本地克隆apache/dubbo-samples仓库后,本节将讨论具体组织的描述。.├──codestyle//用于开发的样式配置文件├──1-basic//基本入门案例├──2-advanced//高级用法├──3-extensions//扩展用法示例├──4-governance//服务治理用例├──10-task//Dubbo学习系列实例├──99-集成//集成测试使用├──测试//集成测试使用└──工具//三方组件快速入门工具As如上表所示,apache/dubbo-samples主要由代码样式文件、测试代码、集成测试三部分组成。代码风格文件可以在开发Dubbo代码时使用,包括IntelliJIDEA的配置文件。测试代码是本书要求的核心内容。目前包括5个部分:面向初学者的基础入门用例、面向开发者的进阶进阶使用、面向中间件维护者的Dubbo外设扩展使用示例、面向生产的治理服务治理用例、Dubbo学习系列。本文将以最基本的入门用例为基础,讲解最简单的DubboAPI使用方法。集成测试是Dubbo质量保证体系的重要组成部分。每个版本的Dubbo都会对所有样本进行回归验证,确保Dubbo的所有变更不会影响样本的使用。3.启动一个简单的注册中心从本节开始,将通过三个命令正式部署一个微服务应用。从背景部分可以看出,运行Dubbo应用的一大前提是部署注册中心。为了使本教程更易于使用,我们提供了一个基于ApacheZookeeper注册表的简单启动器。如果需要在生产环境部署注册中心,请参考生产环境初始化一文部署一个高可用的注册中心。Windows:./mvnw.cmdcleancompileexec:java-pltools/embedded-zookeeperLinux/MacOS:./mvnwcleancompileexec:java-pltools/embedded-zookeeper注意:需要打开独立终端运行,命令将一直运行。docker:dockerrun--namesome-zookeeper--restartalways-dzookeeper执行完上面的命令后,稍等片刻,出现下图的日志,表示注册中心已经启动,你可以继续执行后续任务。4、启动服务提供者启动注册中心之后,接下来就是启动一个服务提供者,对外提供服务。dubbo-samples中也提供了相应的示例,可以通过以下命令快速拉取。Windows:./mvnw.cmdcleancompileexec:java-pl1-basic/dubbo-samples-api-Dexec.mainClass="org.apache.dubbo.samples.provider.Application"Linux/MacOS:./mvnwcleancompileexec:java-pl1-basic/dubbo-samples-api-Dexec.mainClass="org.apache.dubbo.samples.provider.Application"注意:需要打开独立终端运行,命令会一直执行.执行完以上命令后,稍等片刻,出现下图的日志(DubboBootstrapawaiting),表示服务提供者已经启动,说明服务提供者可以对外提供服务了。[19/01/2303:55:49:049CST]org.apache.dubbo.samples.provider.Application.main()INFObootstrap.DubboBootstrap:[DUBBO]DubboBootstrap等待...,dubbo版本:3.2.0-beta.3,当前主机:169.254.44.425。启动服务消费者最后一步是启动一个服务消费者来调用服务提供者,这是RPC调用的核心,为服务消费者调用服务提供者提供了一个桥梁。Windows:./mvnw.cmdcleancompileexec:java-pl1-basic/dubbo-samples-api-Dexec.mainClass="org.apache.dubbo.samples.client.Application"Linux/MacOS:./mvnwcleancompileexec:java-pl1-basic/dubbo-samples-api-Dexec.mainClass="org.apache.dubbo.samples.client.Application"执行以上命令后,稍等片刻出现如图日志下面出现(hi,dubbo),打印出来的数据是服务商处理后返回的,标志着一次服务调用成功。接收结果======>hi,dubbo扩展阅读1.消费者如何找到服务端?本用例的第3步启动了一个Zookeeper注册中心,服务提供者将自己的地址写入注册中心,供服务消费者获取。Dubbo会在Zookeeper的/dubbo/interfaceName和/services/appName下写入服务提供者的连接信息。下面是Zookeeper上的数据示例:[zk:localhost:2181(CONNECTED)5]ls/dubbo/org.apache.dubbo.samples.api.GreetingsService/providers[dubbo%3A%2F%2F30.221.146.35%3A20880%2Forg.apache.dubbo.samples.api.GreetingsService%3Fanyhost%3Dtrue%26application%3Dfirst-dubbo-provider%26background%3Dfalse%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26environment%3Dgenerproduct%%3Dfalse%26interface%3Dorg.apache.dubbo.samples.api.GreetingsService%26ipv6%3Dfd00%3A1%3A5%3A5200%3A3218%3A774a%3A4f67%3A2341%26methods%3DsayHi%26pid%3D85639%23release.4service%3D-namemapping%3Dtrue%26side%3Dprovider%26timestamp%3D1674960780647][zk:localhost:2181(CONNECTED)2]ls/services/first-dubbo-provider[30.221.146.35:20880][zk:localhost:2181(CONNECTED))3]get/services/first-dubbo-provider/30.221.146.35:20880{"name":"first-dubbo-provider","id":"30.221.146.35:20880","address":"30.221.146.35"“端口”:20880,"sslPort":null,"payload":{"@class":"org.apache.dubbo.registry.zookeeper.ZookeeperInstance","id":"30.221.146.35:20880","name":"first-dubbo-provider","metadata":{"dubbo.endpoints":"[{\"port\":20880,\"protocol\":\"dubbo\"}]","dubbo.metadata-service.url-params":"{\"connections\":\"1\",\"version\":\"1.0.0\",\"dubbo\":\"2.0.2\",\"release\":\"3.1.4\",\"side\":\"provider\",\"ipv6\":\"fd00:1:5:5200:3218:774a:4f67:2341\",\"端口\":\"20880\",\"协议\":\"dubbo\"}","dubbo.metadata.revision":"871fbc9cb2730caea9b0d858852d5ede","dubbo.metadata.storage-type":"local"”,“ipv6”:“fd00:1:5:5200:3218:774a:4f67:2341","timestamp":"1674960780647"}},"registrationTimeUTC":1674960781893,"serviceType":"DYNAMIC","uriSpec":null}Dubbo服务发现模型的更多细节,你可以参考ServiceDiscovery文章2.消费者如何发起请求?在Dubbo的调用模型中,接口是连接服务消费者和服务提供者的桥梁,服务提供者实现指定的接口,服务消费者通过Dubbo订阅到这个接口。当服务消费者调用这个接口时,Dubbo会将请求封装成一个网络请求,然后发送给服务提供者进行实际调用。在这个用例中,定义了一个GreetingsService的接口,它有一个方法名为sayHi。//1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/api/GreetingsService.javapackageorg.apache.dubbo.samples.api;publicinterfaceGreetingsService{StringsayHi(Stringname);}服务消费者可以通过Dubbo的API获取GreetingsService接口的代理,然后按照正常的接口调用方式进行调用。得益于Dubbo的动态代理机制,这一切就像在本地调用一样。//1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java//获取订阅的StubGreetingsServiceservice=reference.get();//像普通调用Stringmessage=service.sayHi("dubbo");3、可以部署多台服务器吗?是的,本节将演示如何启动服务器集群。1)启动一个注册中心,可以参考实战3节教程2)修改服务提供者返回的数据,让第一个启动的服务提供者返回hi,dubbo。我是provider1,修改/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java文件的1-basic第25行如下所示。//1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.javapackageorg.apache.dubbo.samples.provider;importorg.apache.dubbo.samples.api.问候服务;publicclassGreetingsServiceImplimplementsGreetingsService{@OverridepublicStringsayHi(Stringname){return"hi,"+name+"。我是提供者1。";}}3)启动第一个服务提供者,可以参考动手实践第4节教程4)修改服务提供者返回的数据,使第二个启动的服务提供者返回hi,dubbo。我是provider2.修改/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java文件的1-basic/dubbo-samples-api/src第25行如下图。//1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.javapackageorg.apache.dubbo.samples.provider;importorg.apache.dubbo.samples.api.问候服务;publicclassGreetingsServiceImplimplementsGreetingsService{@OverridepublicStringsayHi(Stringname){return"hi,"+name+"。我是提供者2。";}}4)启动第二个服务提供者,可以参考动手实践第4节教程5)启动服务消费者,可以参考动手实践第5节教程。如果多次启动消费者,可以看到返回的结果都不一样。在dubbo-samples中,还有一个consumerapplicationorg.apache.dubbo.samples.client.AlwaysApplication会定时发起调用,可以通过以下命令启动。Windows:./mvnw.cmdcleancompileexec:java-pl1-basic/dubbo-samples-api-Dexec.mainClass="org.apache.dubbo.samples.client.AlwaysApplication"Linux/MacOS:./mvnwcleancompileexec:java-pl1-basic/dubbo-samples-api-Dexec.mainClass="org.apache.dubbo.samples.client.AlwaysApplication"启动后可以看到类似如下的日志,consumer会随机调用不同的是,对于服务提供者来说,返回的结果也是远程服务提供者感受到的结果。SunJan2911:23:37CST2023接收结果======>嗨,dubbo。我是provider1.SunJan2911:23:38CST2023收到结果======>hi,dubbo。我是provider2.SunJan2911:23:39CST2023收到结果======>hi,dubbo。我是provider2.SunJan2911:23:40CST2023接收结果======>嗨,dubbo。我是provider1.SunJan2911:23:41CST2023收到结果======>hi,dubbo。我是供应商1.4。这个用例复杂吗?不需要,Dubbo只需要简单的配置就可以实现稳定高效的远程调用。下面是一个服务提供者的简单示例,可以通过定义一些配置来启动。//1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/Application.java//定义所有服务ServiceConfigservice=newServiceConfig<>();service.setInterface(GreetingsService.class);service.setRef(newGreetingsServiceImpl());//启动DubboDubboBootstrap.getInstance().application("first-dubbo-provider").registry(newRegistryConfig(ZOOKEEPER_ADDRESS)).protocol(newProtocolConfig("dubbo",-1)).service(服务).start();以下是服务消费者的一个简单示例。定义好几个配置后,启动后就可以获取到相应的代理对象,然后用户就可以完全不需要去感知这个对象背后的复杂实现,一切只需要和本地调用一样即可。//1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java//定义所有订阅ReferenceConfigreference=newReferenceConfig<>();reference.setInterface(GreetingsService.class);//启动DubboDubboBootstrap.getInstance().application("first-dubbo-consumer").registry(newRegistryConfig(ZOOKEEPER_ADDRESS)).reference(reference).start();//获取SubscribedStubGreetingsServiceservice=reference.get();//像普通java接口一样调用Stringmessage=service.sayHi("dubbo");More本用例介绍了一个RPC远程调用的基本流程,通过启动注册中心、服务提供者、服务消费者三个节点来模拟一个微服务部署架构。在接下来的教程中,我们将讲解服务提供者和服务消费者的配置,告诉你如何从零开始构建一个微服务应用。欢迎来到DubboStarhttps://github.com/apache/dubbo。搜索并关注官方微信公众号:ApacheDubbo,了解更多行业最新动态,掌握各大厂面试必备的Dubbo技能