首页 > 其他分享 >【Dubbo RPC 框架-服务发现&常用特性】

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

时间:2023-03-02 16:03:13浏览次数:40  
标签:Dubbo 服务 框架 Service dubbo spring RPC version org

零、本文纲要

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

一、服务发现

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


节点角色:

  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 RPC 框架-服务发现&常用特性】_mvc_02


①序列化 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,服务,框架,Service,dubbo,spring,RPC,version,org
From: https://blog.51cto.com/u_15874356/6093945

相关文章

  • Java应用【Ⅺ】在 Java 中使用MyBatis框架进行关系型数据库操作
    如果您觉得本博客的内容对您有所帮助或启发,请关注我的博客,以便第一时间获取最新技术文章和教程。同时,也欢迎您在评论区留言,分享想法和建议。谢谢支持!相关阅读:​​Java应用【......
  • SSM框架-Spring学习日记3
    依赖注入(DI)依赖注入(DependencyInjection,DI)。依赖:指Bean对象的创建依赖于容器.Bean对象的依赖资源。注入:指Bean对象所依赖的资源,由容器来设置和装配。Se......
  • ssh框架整合模板
    Spring2.5+Hibernate3.3+Struts1.3整合开发struts-config.xml:<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//D......
  • go 下的查询数据库的框架 ORM框架:访问mysql数据库
    运维的基友习惯使用python了,学习go的时候是不是被gorm恶心死了例如pythonflask框架下的orm那么好用简单,或者号称世界上最好用的语言php的同学们也是非常的苦恼呢......
  • 分布式系统框架
    HadoopModelHadoopCommon基础型功能HadoopDistributedFileSystem负责存放数据YARN负责资源的调配MapReduce大数据的计算框架Ozone数据存放到仓......
  • 框架串讲四
    SpringBootSpringBoot提供了哪些核心功能?起步依赖自动配置jar包快速启动SpringBoot核心注解是什么?由哪几个注解组成?@SpringBootApplication @SpringBootConfi......
  • 模拟浏览器与服务器交互(简易TomCat框架)
    模拟浏览器发送请求到服务器获取资源的思想和代码实现浏览器发送请求到服务器获取资源的流程和概念日常我们使用的浏览器,底层都是帮我们做了很多事情,我们只需要用,比如......
  • SSM框架整合
    SSM框架整合1.环境要求环境要求IDEAMysqlTomcatMaven2.数据库环境创建存放数据的数据库以及数据库表例子:创建一个存放书籍数据的数据库和数据库表CREATEDATAB......
  • 时钟轮在RPC中的应用
    分布式环境下,RPC框架自身以及服务提供方的业务逻辑实现,都应该对异常进行合理地封装,让使用方可以根据异常快速地定位问题;而在依赖关系复杂且涉及多个部门合作的分布式系统中,......
  • 前端框架vue中的v-on和v-bind的区别
    1.v-on指令监听DOM事件,并在触发时运行一些JavaScript代码"v-on:"的语法糖为"@",语法糖就是简写的意思。例如:<!--事件处理函数--><divid="app"> <!--语法:v-on:事......