Dubbo RPC 框架-服务发现&常用特性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo RPC 框架-服务发现&常用特性相关的知识,希望对你有一定的参考价值。

零、本文纲要

  • 一、服务发现
  • 二、Dubbo快速入门(Spring+Spring MVC)
    ① dubbo-interface模块
    ② dubbo-service模块
    ③ dubbo-web模块
  • 三、其他特性
    ①序列化 implements Serializable
    ②超时timeout
    ③重试retries
    ④版本控制version
    ⑤负载均衡loadbalance
    ⑥集群容错cluster
    ⑦服务降级mock

一、服务发现

【Dubbo


节点角色:

  1. Provider:服务提供方;
  2. Consumer:服务消费方;
  3. Container:服务运行容器;
  4. Registry:服务注册和发现的注册中心;
  5. Monitor:调用次数和时间的监控中心。


二、Dubbo快速入门

模块分类:

  • dubbo-interface:存放接口类;
  • dubbo-pojo:存放实体类;
  • dubbo-service:服务提供方;
  • dubbo-web:服务消费方;

① dubbo-interface模块
UserService接口类


public interface UserService 
public String sayHello();

② dubbo-service模块
Ⅰ、pom.xml

  • 基本依赖:servlet、spring-webmvc、spring-context、dubbo、curator-framework、curator-recipes
  • 接口依赖:dubbo-interface 主要需要UserService接口类


<!-- servlet3.0规范的坐标 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--spring的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>$spring.version</version>
</dependency>
<!--springmvc的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>$spring.version</version>
</dependency>
<!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>$dubbo.version</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>$zookeeper.version</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>$zookeeper.version</version>
</dependency>
<!--依赖公共的接口模块-->
<dependency>
<groupId>com.itheima</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
  • tomcat插件:每个模块需要具备独立对外提供服务的能力


<!--tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>9090</port>
<path>/</path>
</configuration>
</plugin>

Ⅱ、web.xml

  • ContextLoaderListener
    服务器启动时获取Spring应用上下文容器(此处为:XmlWebApplicationContext)。


<!-- spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext*.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Ⅲ、applicationContext.xml

  • 基本配置:
    a、应用名称:<dubbo:application name="dubbo-service"/>;
    b、注册中心地址:<dubbo:registry address="zookeeper://192.168.253.128:2181"/>
    c、dubbo注解扫描:<dubbo:annotation package="com.itheima.service.impl"/>
  • 其他配置:
    a、dubbo协议端口号:<dubbo:protocol port="20880"/>,同一主机分布部署多个不同的服务时需要修改;
    b、dubbo-admin元信息:<dubbo:metadata-report address="zookeeper://192.168.253.128:2181"/>,使用dubbo-admin可视化管理平台需要配置,高版本默认有配置。


<!--    <context:component-scan base-package="com.itheima.service"/>-->

<dubbo:protocol port="20880"/>
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-service"/>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.253.128:2181"/>
<!--3.配置dubbo的包扫描-->
<dubbo:annotation package="com.stone.service.impl"/>

<!--元数据配置-->
<dubbo:metadata-report address="zookeeper://192.168.253.128:2181"/>

Ⅳ、UserServiceImpl服务实现类

  • @Service注解
    此处@Service注解记得使用Dubbo提供的注解


import org.apache.dubbo.config.annotation.Service;
@Service//此处@Service注解记得使用Dubbo提供的注解
public class UserServiceImpl implements UserService
public String sayHello()
return "hello dubbo!~";

这样我们服务提供方的内容就已经准备完成,启动服务后即可将服务注册到ZooKeeper注册中心。
③ dubbo-web模块
Ⅰ、pom.xml

  • 基本依赖:servlet、spring-webmvc、spring-context、dubbo、curator-framework、curator-recipes
  • 接口依赖:dubbo-interface 主要需要UserService接口类


<!-- servlet3.0规范的坐标 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--spring的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>$spring.version</version>
</dependency>
<!--springmvc的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>$spring.version</version>
</dependency>
<!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>$dubbo.version</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>$zookeeper.version</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>$zookeeper.version</version>
</dependency>
<!--依赖公共的接口模块-->
<dependency>
<groupId>com.itheima</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
  • tomcat插件:每个模块需要具备独立对外提供服务的能力,web对外提供服务就更需要了


<!--tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8000</port>
<path>/</path>
</configuration>
</plugin>

Ⅱ、web.xml

  • DispatcherServlet
    这里我们并没有再配置ContextLoaderListener,是因为DispatcherServlet也会有对应的Spring应用上下文容器,而且此处只需要Spring MVC相关的容器即可。
<!-- Springmvc -->   
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

Ⅲ、springmvc.xml

  • 基本配置:
    a、应用名称:<dubbo:application name="dubbo-service"/>
    b、注册中心地址:<dubbo:registry address="zookeeper://192.168.253.128:2181"/>
    c、dubbo包扫描:<dubbo:annotation package="com.stone.controller"/>
    d、Spring MVC注解驱动:<mvc:annotation-driven/>提供Controller请求转发,json自动转换等功能。
    e、Spring MVC包扫描:<context:component-scan base-package="com.stone.controller"/>
  • 其他配置:
    a、Dubbo监控中心相关:<dubbo:parameter key="qos.port" value="33333"/>


<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-service">
<dubbo:parameter key="qos.port" value="33333"/>
</dubbo:application>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.253.128:2181"/>
<!--3.配置dubbo的包扫描-->
<dubbo:annotation package="com.itheima.controller"/>

<mvc:annotation-driven/>
<!--扫描springmvc的注解-->
<context:component-scan base-package="com.itheima.controller"/>

Ⅳ、UserController类

  • @Reference注解
    a、从zookeeper注册中心获取userService的访问url
    b、进行远程调用RPC
    c、将结果封装为一个代理对象,给变量赋值


@RestController
@RequestMapping("/user")
public class UserController

//注入Service
//@Autowired//本地注入
/**
* 关于@Reference的使用:
* 1.从zookeeper注册中心获取userService的访问url
* 2.进行远程调用RPC
* 3.将结果封装为一个代理对象,给变量赋值
*/
@Reference
private UserService userService;
/*mock = "force:return null"表示不再调用UserService的服务*/

@RequestMapping("/sayHello")
public String sayHello()
return userService.sayHello();

这个时候我们启动dubbo-web模块就可以实现,消费者从注册中心拉取服务地址,然后调用消费服务了。

三、其他特性

【Dubbo


①序列化 implements Serializable

细心的读者肯定看到上面还有一个dubbo-pojo存放实体类的模块没有涉及到,这个模块作用就是为了在实际开发中服务提供方(生产者)查询到具体结果,传递给服务消费方(消费者)处。

为了让进程间能够顺利通信,此处我们需要序列化对应的实体类。在Java的开发中只需要implements Serializable实现相应的接口即可。

import java.io.Serializable;

/**
* 所有的pojo类都要实现Serializable接口
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable
private int id;
private String username;
private String password;

②超时timeout
@Service注解的timeout属性,@Reference注解也有该属性,建议在@Service注解上使用。服务提供方来确认服务正常的反馈时间,以及超时时间。


@Service(timeout = 3000)//设置当前服务3秒超时

③重试retries
@Service注解的retries属性


@Service(retries = 2)//设置当前服务调用失败后还可以重试2次,共计3次

④版本控制version
@Service注解的version属性


@Service(version = "v1.0")//服务提供方
@Service(version = "v2.0")//服务提供方
@Reference(version = "v1.0")//服务消费方

⑤负载均衡loadbalance
@Reference注解的loadbalance属性

  • random(默认)——RandomLoadBalance按权重随机
  • roundrobin——RoundRobinLoadBalance按权重轮询
  • leastactive——LeastActiveLoadBalance最少活跃调用,相同活跃随机
  • consistenthash——ConsistentHashLoadBalance一致性Hash


@Service(weight = 100)//配置权重
@Service(weight = 200)
@Reference(loadbalance = "random")

⑥集群容错cluster
Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking

  • failover——失败重试,默认2次,一般用于读操作
  • failfast——失败一次直接报错,一般用于写操作
  • failsafe——失败出现异常时忽略,返回一个空结果
  • failback——失败自动恢复,定时重发
  • forking——并行调用多个服务器,成功一个即返回
  • broadcast——广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于通知所有提供者更新缓存或日志等本地资源信息。


@Reference(cluster = "failover")
@Service//不同的IP地址的service

⑦服务降级mock

  • mock=force:return null——表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。
  • mock=fail:return null——表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。


@Reference(mock = "force:return null")

整合各个功能


@Reference(version = "v1.0",loadbalance = "random",
cluster = "failover",mock = "force:return null")//版本控制、负载均衡、集群容错、服务降级
@Service(timeout = 3000,retries = 2,version = "v1.0",weight = 100)//1.0集群
@Service(timeout = 3000,retries = 2,version = "v1.0",weight = 200)//1.0集群
@Service(timeout = 3000,retries = 2,version = "v1.0",weight = 100)//1.0集群
@Service(timeout = 3000,retries = 2,version = "v2.0",weight = 100)//超时重试、版本控制、权重配置

补充:各个模块的依赖关系

  • dubbo-interface依赖dubbo-pojo dubbo-interface内部会定义相应的service接口,接口内会使用到具体的POJO类,所以此模块需要依赖dubbo-pojo;
  • dubbo-service&dubbo-web依赖dubbo-interface
    实际开发中还会有dubbo-parent做聚合管理、版本控制,此处不展开了。

四、结尾

以上即为Dubbo基础使用的相关内容,感谢阅读。



以上是关于Dubbo RPC 框架-服务发现&常用特性的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo3高级特性「框架与服务」RPC全链路调用追踪参数传递(OpenTracing)

稳定性 耗时 监控原因分析-- dubbo rpc 框架 的线程池,io 连接模型. 客户端,服务端

Dubbo3高级特性「框架与服务」 针对出现异常的RPC的服务功能降级机制

实战Dubbo常用参数与服务治理参数配置

Dubbo

Dubbo3高级特性「框架与服务」RPC调用上下文的介绍(全链路追踪基础)