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种
@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();
}
复制代码
默认配置中心的优先级配置最高。配置中心单独配置本地也要进行配置。保证高可用。
通过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 复制代码