dubbo使用手册
简介
Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 微服务开发框架,它帮助解决微服务开发中的通信问题,同时为构建企业级微服务提供治理能力。Dubbo 不绑定开发语言。
Dubbo 控制台安装
Admin 是服务治理控制面中的一个核心组件,负责微服务集群的服务治理、可视化展示等。
配置文件
在
/usr/local/docker/dubbo-admin/config目录下新建 application.properties;server.port=38080 dubbo.protocol.port=30880 dubbo.application.qos-port=32222 admin.registry.address=zookeeper://192.168.2.103:2181 admin.config-center=zookeeper://192.168.2.103:2181 admin.metadata-report.address=zookeeper://192.168.2.103:2181 admin.root.user.name=root admin.root.user.password=rootdocker-compose.yml参考地址
version: "3.8" services: dubbo-admin: image: apache/dubbo-admin restart: unless-stopped environment: TZ: Asia/Shanghai ports: - "38080:38080" volumes: - /usr/local/docker/dubbo-admin/config:/config
一个最简单的 Dubbo 应用
公用接口项目
新建一个 dubbo-interface 项目,内容如下:
package org.apache.dubbo.springboot.demo; public interface DemoService { String sayHello(String name); }服务提供者
新建一个 dubbo-provider 项目,内容如下:
业务类package org.apache.dubbo.springboot.demo.provider; import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.springboot.demo.DemoService; @DubboService public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { return "Hello " + name; } }启动类package org.apache.dubbo.springboot.demo.provider; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableDubbo public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }配置dubbo: application: name: dubbo-springboot-demo-provider protocol: name: tri port: 50052 registry: address: zookeeper://192.168.2.103:2181,192.168.2.103:2182服务消费者
业务类package org.apache.dubbo.springboot.demo.consumer; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.springboot.demo.DemoService; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; // CommandLineRunner 接口中的方法会在程序启动后立即执行 @Component public class Task implements CommandLineRunner { @DubboReference private DemoService demoService; @Override public void run(String... args) throws Exception { String result = demoService.sayHello("world"); System.out.println("Receive result ======> " + result); } }启动类package org.apache.dubbo.springboot.demo.consumer; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableDubbo public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }配置dubbo: application: name: dubbo-springboot-demo-consumer registry: address: zookeeper://192.168.2.103:2181,192.168.2.103:2182
Dubbo 应用配置手册
序列化
Dubbo 默认使用 Hessian2 作为默认序列化其他序列化方式,配置如下:
dubbo:
protocol:
serialization: hessian2Kryo 序列化专门针对 Java 语言,这些序列化方式的性能多数都显著优于 hessian2,在面向生产环境的应用中,建议目前更优先选择 Kryo。参考地址
<!-- pom.xml (Spring Boot) -->
<dependencies>
<dependency>
<groupId>org.apache.dubbo.extensions</groupId>
<artifactId>dubbo-serialization-kryo</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>5.4.0</version>
</dependency>
<dependency>
<groupId>de.javakaffee</groupId>
<artifactId>kryo-serializers</artifactId>
<version>0.45</version>
</dependency>
</dependencies># application.yml (Spring Boot)
dubbo:
protocol:
serialization: kryo流量控制(限流)
流量控制更多的是站在 Dubbo 服务提供者 视角来保证服务稳定性,通过为 Dubbo 服务设置请求上限阈值,确保服务所处理的请求数始终在一个合理范围之内。参考地址
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
在 Dubbo 框架内实现了两种自适应限流算法,分别是基于启发式平滑的 HeuristicSmoothingFlowControl 和基于窗口的 AutoConcurrencyLimier。要确保服务端存在多个节点,并且消费端开启重试策略的前提下,限流功能才能更好的发挥作用。
HeuristicSmoothingFlowControl
当服务端收到一个请求时,若 CPU 使用率是否超过 50%,说明当前的负载较高,便从 HeuristicSmoothingFlowControl 算法中获得当前的 maxConcurrency(最大并发) 值。如果当前正在处理的请求数量超过了 maxConcurrency,则拒绝该请求。
AutoConcurrencyLimier
AutoConcurrencyLimiter 是基于窗口的,每当窗口内积累了一定量的采样数据时,才利用窗口内的数据来更新得到 maxConcurrency,其次对剩余的容量进行探索。
# application.yml (Spring Boot) dubbo: provider: flowcontrol: heuristicSmoothingFlowControl
熔断降级
熔断降级则是更多的从 Dubbo 服务消费者 视角来保障系统稳定性的重要手段。相比于熔断后直接返回调用失败信息,配合服务降级能力,我们可以继续调用预先设置好的服务降级逻辑,以降级逻辑的结果作为最终调用结果,以更优雅的返回给服务调用方。参考地址

