Dubbo服务治理的体现
SpringBoot + Dubbo
1、生态化(融入springBoot)支持更多组件
2、标准化
Dubbo对SpringBoot-starter的支持
pom中增加springboot-dubbo的start使得springBoot自动集成dubbo
<!-- spring-boot dubbo-starter 自动集成dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.1</version>
</dependency>
自动配置的文件:
之后引用dubbo核心,dubbo的依赖为:
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.2</version>
</dependency>
使用zookeeper
<!-- zk 服务注册-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
最基本配置:
dubbo.application.name=spring-boot-dubbo
#配置集群时地址
#dubbo.registry.address=zookeeper://目标服器地址?backup=ip:port,ip:port
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.scan.base-packages=com.fighting.an.impl
#调整dubbo日志级别用于调试错误
logging.level.root=DEBUG
定义JAVA接口
package com.fightingan.dev;
/**
* @author 30378
*/
public interface ISayHello {
void sayHello();
}
完成实现类:
package com.fightingan.dev.springbootdubbo.impl;
import com.fightingan.dev.ISayHello;
import org.apache.dubbo.config.annotation.Service;
/**
* @author 30378
* 注解形式发布端口(install形式发布jar包,并且调用在pom种将其引入)
*/
@Service
public class SayHelloImpl implements ISayHello {
@Override
public void sayHello() {
System.out.println("Hello Dubbo");
}
}
启动SpringBoot即可
@SpringBootApplication
public class SpringbootDubboApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDubboApplication.class, args);
}
}
@RestController
public class TestController {
com.yan.dev.IsayHello isayHello = null;
//远程调用的服务接口
@Reference
@RequestMapping("/hello")
String sayHello(){
return isayHello.sayHello();
}
}
@Service可以实现服务端的负载均衡(loadbalance默认时random,基于权重的随机算法)以及配置当前程序权重weight
@Service(loadbalance = "random",weight = 9)
public class SayHello implements IsayHello {
@Override
public void sayHello() {
System.out.println("Hello yan !");
}
}
开启一个新的程序:
Dubbo的负载均衡算法有:最小活跃度(LeastActiveLoadBalance 如果性能高、积累少、活跃度低 ----> 优先考虑,动态计算 )、随机(RandomLoadBalance)、加权轮询RoundRobinLoadBalance、一致性Hash(ConsistentHashLoadBalance)
Dubbo是非web项目,不需要部署tomcat
配置优先级,以客户端为准( method > service(Reference) > 服务端 )
@Reference(loadbalance = "roundrobin")
容错机制(策略)
容错情况:大概为6种
- 重试 failover(默认情况,但可能出现数据重复,默认重试3次,retries=2,重试2次加本来的调用一共三次)
- 不希望重试,快速失败 failfast
- 失败之后,记录日志重新发起 failback
- 失败安全 错误后直接忽略 failsafe
- 并行调用多个服务器 forking
- 广播出去 -> 任何一台报错就失败(更新所有节点缓存)
@Service(loadbalance = "random",weight = 9,cluster = "failsafe")
服务降级
异常降级 -> 异常提供默认数据
限流降级 -> 线程池类似(拒绝)
熔断降级 -> [触发条件]
Mock 机制(通过mock属性来指定对应类)
1、定义对应的类
package com.yan.dev.client;
/**
* @author 30378
* 服务降级
*/
public class SayHelloMock implements com.yan.dev.IsayHello{
@Override
public String sayHello(){
return "异常处理的兜底数据!";
}
}
2、在客户端
mock一下,客户端返回值,返回给服务端,,timeout = 200 设置超时,服务器、客户端都可用。
@Reference(loadbalance = "roundrobin",mock = "com.yan.dev.client.SayHelloMock",timeout = 200)
@RequestMapping("/hello")
String sayHello(){
return isayHello.sayHello();
}
2.7新功能
配置中心
默认配置中心的优先级配置最高。配置中心单独配置本地也要进行配置。保证高可用。
通过zk实现配置中心
dubbo的config
#配置中心
dubbo.config-center.address=zookeeper://127.0.0.1:2181
dubbo.config-center.app-name=springboot-dubbo-provider
dubbo.scan.base-package=com.fightingan.dev
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
dubbo.application.name=spring-dubbo
#配置集群时地址(本地配置)
#dubbo.registry.address=zookeeper://目标服器地址?backup=ip:port,ip:port
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.simplified=true
dubbo.scan.base-packages=com.yan.dev.dubboprovide.impl
url驱动
元数据中心(redis/zookeeper)
配置中心的参数较多,多个服务器时维护成本更高,所以产生元数据配置中心,目的是简化配置,节省网络传输,提升存储空间。
数据现转存储到metedata节点种