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 复制代码