dubbo日常记录

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方式

  1. 引入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("--异常回调--");
    }
}

dubbo 标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值