成功就是将个人潜能发挥到极限!&&以大多数人的努力程度之低,根本还轮不到拼天赋.........
一图告知分布式架构Dubbo原理
/**
* 服务提供者:
* 调用流程:
* 1、服务提供方启动运行,向注册中心注册服务;
* 2、服务消费者启动运行,向注册中心注册,并订阅自己所需的服务。
* 3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送不变更数据给消费者。
* 4、服务消费者,从提供者地址列表中基于负载均衡算法,选一台提供者进行调用,如果调用失败再选另一台调用。
* 5、服务消费者和提供者,在内存中累计调用次数和调用时间,每分钟发送一次统计数据到监控中心。
*
*/
引入dubbo相关依赖
com.alibaba.boot
dubbo-spring-boot-starter
0.2.0
com.alibaba
dubbo
2.6.2
org.apache.zookeeper
zookeeper
3.4.11
com.101tec
zkclient
0.10
一,创建服务接口及降级服务实现类
如上图:分别创建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);
}
}