微服务解决方案 -- Spring Cloud Alibaba (八)Dubbo 服务消费者
不了解此套教程的可以移步之前章节
1.微服务解决方案 – Spring Cloud Alibaba (一)服务的注册与发现
2.微服务解决方案 – Spring Cloud Alibaba (二)服务提供者
3.微服务解决方案 – Spring Cloud Alibaba (三)服务消费者(Feign)
4.微服务解决方案 – Spring Cloud Alibaba (四)服务熔断
5.微服务解决方案 – Spring Cloud Alibaba (五)分布式配置中心
6.微服务解决方案 – Spring Cloud Alibaba (六)Dubbo远程过程调用
7.微服务解决方案 – Spring Cloud Alibaba (七)Dubbo 服务提供者
服务消费者
与提供者的pom文件基本保持一直
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot -->
<!-- Apache Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- Apache Dubbo -->
<!-- Projects -->
<dependency>
<groupId>com.laoshiren</groupId>
<artifactId>hello-apache-dubbo-provider-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!-- Projects -->
</dependencies>
spring:
application:
name: dubbo-provider
main:
allow-bean-definition-overriding: true
dubbo:
scan:
base-packages: com.laoshiren.apache.dubbo.provider.service
protocol:
name: dubbo
## -1 自动分配端口号
port: 20880
registry:
address: nacos://192.168.0.108:8848
入口类
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
调用provider
,我们需要用@Reference
注解,这里的是org.apache.dubbo.config.annotation
包下的
@Reference(version = "1.0.0")
private EchoService echoService;
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return echoService.echo(string);
}
首先确保nacos
正常启动,然后启动Provider
,最后启动Consumer
。
高速序列化
Dubbo 中支持的序列化方式:
- json 序列化:一种是采用的阿里的 fastjson 库。
- java 序列化: 主要是采用 JDK 自带的 Java 序列化实现,性能很不理想。
在Dubbo中使用高效的Java序列化(Kryo和FST)
当然,在对一个类做序列化的时候,可能还级联引用到很多类,比如Java集合类。针对这种情况,我们已经自动将JDK中的常用类进行了注册,所以你不需要重复注册它们(当然你重复注册了也没有任何影响),包括:
GregorianCalendar
InvocationHandler
BigDecimal
BigInteger
Pattern
BitSet
URI
UUID
HashMap
ArrayList
LinkedList
HashSet
TreeSet
Hashtable
Date
Calendar
ConcurrentHashMap
SimpleDateFormat
Vector
BitSet
StringBuffer
StringBuilder
Object
Object[]
String[]
byte[]
char[]
int[]
float[]
double[]
由于注册被序列化的类仅仅是出于性能优化的目的,所以即使你忘记注册某些类也没有关系。事实上,即使不注册任何类,Kryo和FST的性能依然普遍优于hessian和dubbo序列化。
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-kryo</artifactId>
</dependency>
注意消费者和提供者都需要添加此依赖。
dubbo:
protocol:
serialization: kryo
如果你需要返回一个自定义的实体类,记得加上序列化接口,最好生成serialVersionUID
。
这里推荐一个插件,可以自动生成序列ID