Dubbo服务降级实践【SpringBoot2.x与Dubbo2.6.x+Zookeeper集群整合】

一图告知分布式架构Dubbo原理

    

           

/**
 * 服务提供者:
 * 调用流程:
 * 1、服务提供方启动运行,向注册中心注册服务;
 * 2、服务消费者启动运行,向注册中心注册,并订阅自己所需的服务。
 * 3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送不变更数据给消费者。
 * 4、服务消费者,从提供者地址列表中基于负载均衡算法,选一台提供者进行调用,如果调用失败再选另一台调用。
 * 5、服务消费者和提供者,在内存中累计调用次数和调用时间,每分钟发送一次统计数据到监控中心。
 *
 */

引入dubbo相关依赖

<!-- 引入spring-boot-starter以及dubbo和curator的依赖 -->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.2</version>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.11</version>
</dependency>
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>

一,创建服务接口及降级服务实现类

如上图:分别创建DubboComplexService接口及服务降级实现类DubboComplexServiceMock(注意:降级服务类必需与服务接口在同一目录下)

package org.jy.data.yh.bigdata.platform.service;

/**
 * 复杂的服务降级演示接口
 */
public interface DubboComplexService {

    String returnDubbo(String context);

}

降级服务类如下:

package org.jy.data.yh.bigdata.platform.service;

/**
 * 服务降级类必需更接口在同一个目录下面
 */
public class DubboComplexServiceMock implements DubboComplexService {

    @Override
    public String returnDubbo(String context) {
        return "这是复杂的分布式dubbo复制的降级";
    }
}

二,创建服务提供者(如下图)

创建DubboComplexServiceImpl实现接口DubboComplexService

import com.alibaba.dubbo.config.annotation.Service;

/**
 * mock的值是mock实现类的接口,而不是服务类
@Service(version = "1.0.0" ) // 复杂的服务降级*/
@Service(version = "1.0.0")   // 该注解暴露服务
public class DubboComplexServiceImpl implements DubboComplexService {
    @Override
    public String returnDubbo(String context) { // 超时触发降级服务类被执行
       try{
            Thread.sleep(10*1000); // 10*1000
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return "这返回的是复杂的dubbo分布式服务: "+context;
    }
}

创建服务消费这:此处用网关服务进行消费

创建RpcController服务消费者

package org.jy.data.yh.bigdata.platform.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.rpc.RpcException;
import org.jy.data.yh.bigdata.platform.service.RpcService;
import org.jy.data.yh.bigdata.platform.service.DubboComplexService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// http://localhost:8833/complex?token=1
@RestController
public class RpcController {
    /**
     * Dubbo通过mock实现服务降级,并提供了两种配置方式
     * (1)简单的服务降级:设置服务消费方@Reference注解的mock参数为return null,
     * 表示当远程调用失败时直接返回null,或者其他默认值(return something),
     * 复杂的服务降级方案二:看另外的一个例子
   

    @Reference(check = false,version = "1.0.0",interfaceName = "org.jy.data.yh.bigdata.platform.service.DubboComplexService",mock="true") // 开启复杂服务降级
    private DubboComplexService dubboComplexService;

    @RequestMapping(value="/complex")
    public String returnDubboComplex(){
        String result = null;
        try {
            result = dubboComplexService.returnDubbo("这是dubbo分布式架构传递的参数,复杂服务降级模式配置方式!");
        }catch (RpcException e){
            System.out.println("这里依靠本地事务进行回滚:"+e.getMessage());
        }
        return result;
    }


}

直接访问

http://localhost:端口/complex

返回数据:这是复杂的分布式dubbo复制的降级

数目服务降级类被调用,配置降级策略生效

注意上面的@Reference注解的属性interfaceName的值为服务降级实现类对应的接口全路径

环境为:Springboot2.1.1Release+

dubbo-spring-boot-starter 0.2.0 +Dubbo2.6.2+ JDK1.8

application.properties配置如下

server.port=7722
server.session-timeout=60
server.tomcat.max-threads=1000
server.tomcat.uri-encoding=UTF-8
logging.path=../logs
logging.file=prefixDubboProvider.log
logging.level.root=info

spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.basename=messages


spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/security?characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.initialSize=200
spring.datasource.minIdle=100
spring.datasource.maxActive=500
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=2000
spring.datasource.filters=stat,wall,logback
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

mybatis.mapperLocations=classpath:mapper/*.xml
mybatis.typeAliasesPackage=org.jy.data.elasticsearch.search.model
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
mybatis.configuration.log-prefix=prefix_provider


spring.redis.cluster.nodes=node-1:6379,node-2:6380,node-3:6381,node-4:6382
spring.redis.cluster.timeout=2000
spring.redis.cluster.max-redirects=100
spring.redis.cluster.maxIdle=200
spring.redis.cluster.maxTotal=1000
spring.redis.cluster.maxWaitMillis=2000
spring.session.store-type = redis


# io.dubbo.springboot dubbo整合方式配置模式
# dubbo 相关配置,集群注册中心
#spring.dubbo.application.name=npmnUser-provider
dubbo.application.name=npmnUser-provider
#spring.dubbo.registry.protocol=zookeeper
dubbo.registry.protocol=zookeeper
dubbo.registry.address=node-1:2181,node-2:2181,node-3:2181
dubbo.protocol.name=dubbo
# 服务提供方所暴露的端口号,多个服务提供方不能够重复
dubbo.protocol.port=20880  
dubbo.scan=org.jy.data.yh.bigdata.platform.prefixdubbo.service
dubbo.application.registries.timeout=10000
dubbo.application.registries.session=100000

 启动类如下:

package org.jy.data.yh.bigdata.platform.prefixdubbo;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 服务提供者:
 * 调用流程:
 * 1、服务提供方启动运行,向注册中心注册服务;
 * 2、服务消费者启动运行,向注册中心注册,并订阅自己所需的服务。
 * 3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送不变更数据给消费者。
 * 4、服务消费者,从提供者地址列表中基于负载均衡算法,选一台提供者进行调用,如果调用失败再选另一台调用。
 * 5、服务消费者和提供者,在内存中累计调用次数和调用时间,每分钟发送一次统计数据到监控中心。
 *
 */
@SpringBootApplication
@MapperScan("org.jy.data.yh.bigdata.platform.prefixdubbo.mapper")
@EnableDubbo
@DubboComponentScan("org.jy.data.yh.bigdata.platform.prefixdubbo.service") 
public class PrefixDubboProviderApplication {
    public static void main( String[] args ) {
        SpringApplication.run(PrefixDubboProviderApplication.class,args);
    }
}
发布了74 篇原创文章 · 获赞 4 · 访问量 3164

猜你喜欢

转载自blog.csdn.net/u014635374/article/details/103689838
今日推荐