零、本文纲要
- 一、服务发现
- 二、Dubbo快速入门(Spring+Spring MVC)
① dubbo-interface模块
② dubbo-service模块
③ dubbo-web模块 - 三、其他特性
①序列化 implements Serializable
②超时timeout
③重试retries
④版本控制version
⑤负载均衡loadbalance
⑥集群容错cluster
⑦服务降级mock
一、服务发现
节点角色:
- Provider:服务提供方;
- Consumer:服务消费方;
- Container:服务运行容器;
- Registry:服务注册和发现的注册中心;
- 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模块就可以实现,消费者从注册中心拉取服务地址,然后调用消费服务了。
三、其他特性
①序列化 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基础使用的相关内容,感谢阅读。