您好,登錄后才能下訂單哦!
如何快速上手Dubbo,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
最近項目中需要用到dubbo,雖然我知道dubbo是一個RPC框架,但是沒有去詳細了解這個框架。既然項目要用,那就先把Dubbo的應用給學會,等熟練使用之后,再去了解Dubbo內部的原理。
目前來說,Dubbo是最有名的RPC服務調用框架,他是阿里開源的一個SOA服務治理框架,功能較為完善,支持多種傳輸和序列化方案。Dubbo最常用的應用就是遠程調用。
Dubbo中服務端最核心的對象有四個:
ApplicationConfig:配置當前應用信息
ProtocolConfig:配置提供服務的協議信息
RegistryConfig:配置注冊相關信息
ServiceConfig:配置暴露的服務信息
Dubbo客戶端中核心的對象有兩個:
ApplicationConfig:配置當前應用信息
ReferenceConfig:配置引用的服務信息
接下來通過三種方式入門Dubbo。首先會通過代碼直接展示dubbo的直連和注冊中心實現方式,接著使用Spring和SpringBoot的方式分別展示如何使用Dubbo。
在寫dubbo相關代碼前,我們首先要定義一個公共的客戶端服務,這個服務里存放的是service接口。服務提供者引入這個工程,寫實現類,提供dubbo接口;服務消費者引入這個工程,通過這個工程的service接口調用。
因此新建這樣一個模塊,命名為dubbo-client,整體代碼結構如下,只需要寫一個service接口即可:
User類:
@Data public class User implements Serializable { private static final long serialVersionUID = -9206514891359830486L; private Long id; private String name; private String sex; }
UserService:
public interface UserService { User getUser(Long id); }
接下來通過直接代碼的方式生成一個dubbo服務,并且用另外一個類去調用這個dubbo服務:
核心依賴就兩個,一個dubbo的依賴,另外一個上面的公共接口方法
<dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.4.1</version> </dependency> <dependency> <artifactId>dubbo-client</artifactId> <groupId>com.javayz</groupId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>
服務提供者主要配置以下幾個屬性:
1、application:設置應用的名稱等信息
2、protocol :設置服務的協議
3、register:設置服務的連接方式
4、service:將需要暴露的服務注冊出來
public class DubboProvider { public static void main(String[] args) throws IOException { //暴露UserService服務 //1、application ApplicationConfig applicationConfig=new ApplicationConfig("sample-provider"); //2、protocol -dubbo協議 ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20880); //3、register //直連的方式,不暴露到注冊中心 RegistryConfig registryConfig=new RegistryConfig(RegistryConfig.NO_AVAILABLE); //4、service ServiceConfig serviceConfig=new ServiceConfig(); serviceConfig.setInterface(UserService.class); serviceConfig.setRef(new UserServiceImpl()); //5、將application、protocol、register注冊到service serviceConfig.setRegistry(registryConfig); serviceConfig.setProtocol(protocolConfig); serviceConfig.setApplication(applicationConfig); serviceConfig.export(); System.out.println("服務已經暴露"); System.in.read(); } }
消費者的實現主要就三步:
1、配置application:設置應用的名稱等信息
2、配置reference:主要配置要引用的信息
3、獲取到接口,調用服務。
public class DubboConsumer { public static void main(String[] args) { //1、application ApplicationConfig applicationConfig=new ApplicationConfig("sample-consumer"); //2、配置reference ReferenceConfig referenceConfig=new ReferenceConfig(); referenceConfig.setApplication(applicationConfig); referenceConfig.setInterface(UserService.class); referenceConfig.setUrl("dubbo://172.18.2.49:20880/com.javayz.client.service.UserService?anyhost=true&application=sample&bind.ip=172.18.2.49&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.javayz.client.service.UserService&methods=getUser&pid=5936&release=2.7.4.1&side=provider×tamp=1618036935244"); UserService userService = (UserService) referenceConfig.get(); User user = userService.getUser(1L); System.out.println(user); } }
先啟動提供者,再啟動消費者,如果user信息打印出來了就說明調用成功。
這里的Register使用的是直連的方式,我們也可以使用注冊中心,這里以zookeeper為例。首先在項目中引入zookeeper相關依賴:
<!-- zk客戶端依賴:curator --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.13.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.13.0</version> </dependency>
服務提供者修改一處地方,將RegistryConfig修改為zookeeper的連接方式
//register //直連的方式,不暴露到注冊中心 //RegistryConfig registryConfig=new RegistryConfig(RegistryConfig.NO_AVAILABLE); //通過注冊中心暴露dubbo RegistryConfig registryConfig=new RegistryConfig("zookeeper://192.168.78.128:2181");
消費者同樣修改一處位置,將referenceConfig中的setUrl方法替換為zookeeper:
RegistryConfig registryConfig=new RegistryConfig("zookeeper://192.168.78.128:2181"); ReferenceConfig referenceConfig=new ReferenceConfig(); referenceConfig.setRegistry(registryConfig); referenceConfig.setApplication(applicationConfig); referenceConfig.setInterface(UserService.class); //referenceConfig.setUrl("dubbo://172.18.2.49:20880/com.javayz.client.service.UserService?anyhost=true&application=sample&bind.ip=172.18.2.49&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.javayz.client.service.UserService&methods=getUser&pid=5936&release=2.7.4.1&side=provider×tamp=1618036935244");
通過Spring的方式只不過是把上面寫在Java中的代碼拿到配置文件中去,并把接口注入到Bean容器中,在resource文件夾下新建兩個配置文件: provider.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 提供方應用信息,用于計算依賴關系 --> <dubbo:application name="sample-provider" /> <!-- 使用zookeeper廣播注冊中心暴露服務地址 --> <dubbo:registry address="zookeeper://192.168.78.128:2181" /> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明需要暴露的服務接口 --> <dubbo:service interface="com.javayz.client.service.UserService" ref="userService" /> <!-- 和本地bean一樣實現服務 --> <bean id="userService" class="com.javayz.example1.service.impl.UserServiceImpl" /> </beans>
consumer.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application name="sample-consumer" /> <dubbo:registry address="zookeeper://192.168.78.128:2181" /> <dubbo:reference id="userService" interface="com.javayz.client.service.UserService" /> </beans>
這里的配置文件和上方的代碼均一一對應。接著是服務的提供者和消費者: SpringDubboProvider
public class SpringDubboProvider { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("provider.xml"); System.out.println("服務已經暴露"); System.in.read(); } }
SpringDubboConsumer
public class SpringDubboConsumer { public static void main(String[] args) { ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("consumer.xml"); UserService bean = context.getBean(UserService.class); System.out.println(bean.getUser(1L)); } }
新建兩個SpringBoot項目,一個是服務提供者,一個是服務消費者,引入dubbo的核心依賴
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.4.1</version> </dependency>
這里的配置都寫在application.properties中,首先是服務提供者:
dubbo.application.name=dubbo-provider dubbo.registry.address=zookeeper://192.168.78.128:2181 dubbo.protocol.name=dubbo dubbo.protocol.port=20880
服務提供者需要寫服務的實現類,這里需要注意@Service注解采用的是dubbo包下:
import com.javayz.client.entity.User; import com.javayz.client.service.UserService; import org.apache.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; @Service @Component public class UserServiceImpl implements UserService { @Override public User getUser(Long id) { User user=new User(); user.setId(id); user.setName("javayz"); user.setSex("man"); return user; } }
接著在啟動類上添加一個@EnableDubbo注解即可。
服務的消費者同樣是先寫一下配置文件:
server.port=8081 dubbo.application.name=dubbo-consumer dubbo.registry.address=zookeeper://192.168.78.128:2181
接著通過@Reference注解將service對象引進來
@SpringBootApplication public class SpringbootconsumerApplication { @Reference UserService userService; public static void main(String[] args) { SpringApplication.run(SpringbootconsumerApplication.class, args); } @Bean public ApplicationRunner getBean(){ return args -> { System.out.println(userService.getUser(1L)); }; } }
<dubbo:application/> 用于配置當前應用信息 <dubbo:register/> 用于配置連接注冊相關信息 <dubbo:protocol/> 用于配置提供服務的協議信息,提供者指定協議,消費者被動接受 <dubbo:service/> 用于暴露一個服務,一個服務可以用多個協議暴露,一個服務也可以注冊到多個注冊中心 <dubbo:provider/> 當ProtocolConfig和ServiceConfig某屬性沒有配置時,采用此缺省值 <dubbo:consumer/> 當ReferenceConfig某屬性沒有配置時,采用此缺省值 <dubbo:reference/> 用于創建一個遠程服務代理
更加具體的配置信息我在官網中找到了,大家可參考:
https://dubbo.apache.org/zh/docs/v2.7/user/references/xml/
在企業中,如果消費者直接通過RPC去調用提供者,理論上需要把提供者的整個Jar包引入到項目中。但是這樣的話服務提供這種的其他無關代碼也會被引入其中,導致代碼污染。
因此實際開發過程中,服務提供者和調用者之間會增加一層Client模塊。這個Client中主要寫的是Service的接口定義,接口的返回實例對象以及接口的請求實例對象。簡單來講,所有的定義都在Client中完成。
使用時,服務提供者引入這個Client,然后寫實現方法,服務消費者引入這個Client,然后通過dubbo直接調用即可。
另外企業開發中,可能會出現多個接口實現,這種情況下可以給Service設定group、version等進行區分。
Dubbo的基本使用就這些,Dubbo畢竟只是一個RPC的工具,我們可以用它很方便地暴露、消費服務。但是兩個小時也只是會上手使用,它內部的一些配置,一些理念以及最重要的原理都是需要我們自己去深耕的。
關于如何快速上手Dubbo問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。