dubbo 环境预备 - ZK
下载地址 : https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
解压后复制 zoo_sample.cfg 为 zoo.cfg
启动 bin/zkServer.sh start
查看状态 bin/zkServer.sh status
文件记录日志 zookeeper.out
ZK 需要jdk环境
dubbo 项目pom引用
<properties>
<zkclient.version>0.3</zkclient.version>
<zookeeper.version>3.4.5</zookeeper.version>
<dubbo.version>2.5.7</dubbo.version> //如果你先使用注解方式扫描,必须使用2.5.7及以上版本
</properties>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 如果你用的dubbo是2.6.1及以上版本 需要添加 curator-framework jar包,否则启动会报错-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
<exclusions>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
</exclusions>
</dependency>
dubbo 包需要移除spring依赖,否则项目启动会报错
引用dubbo和zk时,需要注意版本和jar包依赖-这里的坑比较多
dubbo 生产者-(服务端)搭建
xml方式
-
引入dubbo.xml
/*@ImportResource 注解引入xml文件*/ @ImportResource(value = {"classpath*:spring/application.xml"}) @SpringBootApplication public class DubboServerApplication { public static void main(String[] args) { SpringApplication.run(DubboServerApplication.class, args); } }
<!--application.xml 文件引入 dubbo.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="classpath*:dubbo.xml"/> </beans>
当然这里也可以使用@ImportResource 注解直接引入dubbo.xml。
不过当需要引入多个xml文件时,这种间接引入的方式好管理一些
-
dubbo.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://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 当前应用信息: 提供方应用信息,用于计算机依赖关系 - 应用名 --> <dubbo:application name="dubbo_server"/> <!--注册中心相关信息: 使用zk注册中心暴露服务地址--> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <!--提供服务协议的相关信息: dubbo协议暴露端口--> <dubbo:protocol name="dubbo" port="20881"/> <dubbo:service interface="pers.jaye.dubboapi.service.TestService" ref="testServiceImpl"/> </beans>
注解方式 (spring-boot)
-
包扫描
//spring boot 启动类 添加@DubboComponentScan注解指定扫描包路径 - (service服务实现类包所在的路径) @SpringBootApplication @DubboComponentScan(basePackages = {"pers.jaye.dubboserver.service.impl"}) public class DubboServerApplication { public static void main(String[] args) { SpringApplication.run(DubboServerApplication.class, args); } }
-
config配置
@Configuration public class DubboConfig { /*当前应用信息: 提供方应用信息,用于计算机依赖关系- 应用名*/ @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName(APP_NAME); return applicationConfig; } /*注册中心相关信息 : 使用zk注册中心暴露服务地址*/ @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress(ZK_ADDR); return registryConfig; } /*提供服务协议的相关信息: 设置Protocol-dubbo协议和暴露端口*/ @Bean public ProtocolConfig protocolConfig() { ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName(PROTOCOL_NAME); protocolConfig.setPort(PROTOCOL_PORT); return protocolConfig; } }
-
发布服务的注解@Service
//这里的@Service注解使用的是dubbo包下的 import com.alibaba.dubbo.config.annotation.Service; @Service public class TestServiceImpl implements TestService { @Override public void test1() { System.out.printf("------Jaye"); } }
dubbo 消费者-搭建
xml方式
-
引入dubbo.xml
与生产者-(服务端)相同
-
dubbo.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://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--应用名 :提供方应用信息,用于计算机依赖关系--> <dubbo:application name="dubbo_consumer"/> <!--使用zk注册中心暴露服务地址--> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <!--dubbo协议暴露端口--> <dubbo:protocol name="dubbo" port="20881"/> <dubbo:reference id="rpcTestService" interface="pers.jaye.dubboapi.service.TestService"/> </beans>
注解方式 (spring-boot)
-
包扫描
//spring boot 启动类 添加@DubboComponentScan注解指定扫描包路径 - (service服务接口包所在的路径) @SpringBootApplication @DubboComponentScan(basePackages = "pers.jaye.dubboapi.service") public class DubboConsumerApplication { public static void main(String[] args) { SpringApplication.run(DubboConsumerApplication.class, args); } }
-
config
与生产者服务端相同
-
获取服务的注解@Reference
import com.alibaba.dubbo.config.annotation.Reference; @RestController public class Testcontroller { @Reference(check = true) //使用@Reference注解获取生产者服务端提供的服务 private TestService testService; @RequestMapping(value = "/index", method = RequestMethod.GET) public void index() { testService.test1(); } }
dubbo 常用配置策略用法
dubbo启动检查
//关闭某个服务的启动时检测
<dubbo:reference id="rpcTestService" interface="pers.jaye.dubboapi.service.TestService" check="false"/>
//关闭所有服务的启动时检测
<dubbo:consumer check="false"/>
//关闭注册中心启动时检测
<dubbo:registry address="zookeeper://127.0.0.1:2181" check="false"/>
// check=true,检查到接口没提供服务时,抛异常,阻止系统启动,reference对象置null在系统测试阶段,开启可快速发现问题
// check=false,不检测接口是否有提供者,直接为reference生成代理对象只要后续补入provider,程序会自动探测到。线上正式环境使用
dubbo集群容错配置
<dubbo:consumer cluster="failover" retries="2"/>
<!-- failover 当出现失败,重试其他服务. retries来设置重试次数(不含第一次) -->
<!-- failfast 快速失败,只发起一次调用,失败立即报错 -->
<!-- failsafe 出现异常时,直接忽略 -->
<!-- failback 后台记录失败请求,定时重发 -->
<!-- forking 并行调用多个服务,只要成功即返回. froks="2"来设置最大并行数 -->
cluster 参数同样可以在
<dubbo:reference id=“rpcTestService” interface=“pers.jaye.dubboapi.service.TestService” cluster=“failover”/>
dubbo负载均衡配置
<dubbo:consumer loadbalance="random"/>
<!-- Random 按权重随机--根据weight值(服务方设置) -->
<!-- RoundRobin 轮询 -->
<!-- LeastActive 最少活跃数(正在处理的数) -->
loadbalance 参数同样可以在
<dubbo:reference id=“rpcTestService” interface=“pers.jaye.dubboapi.service.TestService” loadbalance=“RoundRobin”/>
dubbo声明式缓存
<dubbo:service interface="pers.jaye.dubboapi.service.TestService" ref="testServiceImpl">
<dubbo:method name="test1" cache="lru"/>
</dubbo:service>
lru 最少使用原则删除缓存
threadlocal 对调用者缓存
dubbo异步调用
<!--async='true' 开启异步 此属性同样可以使用到 <dubbo:method /> 方法标签上-->
<dubbo:reference id="rpcTestServiceAsync" interface="pers.jaye.dubboapi.service.TestService" async="true"/>
//获取异步方法返回的结果
@Autowired
@Qualifier("rpcTestServiceAsync")
private TestService asyncTestService;
String test1 = null;
asyncTestService.test();
Future<String> future = RpcContext.getContext().getFuture();
try {
test1 = future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
dubbo异步回调
<!--async 开启异步 onreturn调用方法成功后回调方法,onthrow调用方法处理异常时回调方法-->
<dubbo:reference id="rpcTestServiceAsync" interface="pers.jaye.dubboapi.service.TestService">
<dubbo:method name="test" async="true" timeout="3000" onreturn="testCallback.testCallbackSuccess"
onthrow="testCallback.testCallbackThrows"/>
</dubbo:reference>
@Component
public class TestCallback {
//第一个参数时调用方法的返回接口,后续参数是入参
public void testCallbackSuccess(String result,....) {
System.out.println("--回调成功--");
System.out.println(result);
}
//参数为异常信息,后续参数是入参
public void testCallbackThrows(Throwable ex,....) {
System.out.println("--异常回调--");
}
}