温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何快速上手Dubbo

发布时间:2021-09-29 14:43:55 来源:亿速云 阅读:185 作者:柒染 栏目:编程语言

如何快速上手Dubbo,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

最近项目中需要用到dubbo,虽然我知道dubbo是一个RPC框架,但是没有去详细了解这个框架。既然项目要用,那就先把Dubbo的应用给学会,等熟练使用之后,再去了解Dubbo内部的原理。

目前来说,Dubbo是最有名的RPC服务调用框架,他是阿里开源的一个SOA服务治理框架,功能较为完善,支持多种传输和序列化方案。Dubbo最常用的应用就是远程调用。

Dubbo中服务端最核心的对象有四个:

ApplicationConfig:配置当前应用信息

ProtocolConfig:配置提供服务的协议信息

RegistryConfig:配置注册相关信息

ServiceConfig:配置暴露的服务信息

Dubbo客户端中核心的对象有两个:

ApplicationConfig:配置当前应用信息

ReferenceConfig:配置引用的服务信息

(二)Dubbo实战

接下来通过三种方式入门Dubbo。首先会通过代码直接展示dubbo的直连和注册中心实现方式,接着使用Spring和SpringBoot的方式分别展示如何使用Dubbo。

在写dubbo相关代码前,我们首先要定义一个公共的客户端服务,这个服务里存放的是service接口。服务提供者引入这个工程,写实现类,提供dubbo接口;服务消费者引入这个工程,通过这个工程的service接口调用。

因此新建这样一个模块,命名为dubbo-client,整体代码结构如下,只需要写一个service接口即可:

如何快速上手Dubbo

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

2.1 直接代码

接下来通过直接代码的方式生成一个dubbo服务,并且用另外一个类去调用这个dubbo服务:

2.1.1 引入依赖

核心依赖就两个,一个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>

2.1.2 编写服务提供者

服务提供者主要配置以下几个属性:

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

2.1.3 编写服务消费者

消费者的实现主要就三步:

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&timestamp=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&timestamp=1618036935244");

2.2 通过Spring

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

2.3 通过SpringBoot的方式

新建两个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的常用配置

<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/

(四)企业中如何通过dubbo实现分布式调用

在企业中,如果消费者直接通过RPC去调用提供者,理论上需要把提供者的整个Jar包引入到项目中。但是这样的话服务提供这种的其他无关代码也会被引入其中,导致代码污染。

因此实际开发过程中,服务提供者和调用者之间会增加一层Client模块。这个Client中主要写的是Service的接口定义,接口的返回实例对象以及接口的请求实例对象。简单来讲,所有的定义都在Client中完成

使用时,服务提供者引入这个Client,然后写实现方法,服务消费者引入这个Client,然后通过dubbo直接调用即可。

另外企业开发中,可能会出现多个接口实现,这种情况下可以给Service设定group、version等进行区分。

(五)总结

Dubbo的基本使用就这些,Dubbo毕竟只是一个RPC的工具,我们可以用它很方便地暴露、消费服务。但是两个小时也只是会上手使用,它内部的一些配置,一些理念以及最重要的原理都是需要我们自己去深耕的。

关于如何快速上手Dubbo问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI