易⽤性
开箱即⽤,易⽤性⾼,如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富,基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能⼒。更加完善了多语言支持(GO PYTHON RUST)
超⼤规模微服务实践
云原生友好
容器调度平台(Kubernetes)
将服务的组织与注册交给底层容器平台,如 Kubernetes,这是更云原 ⽣的⽅式。
Service Mesh
原有Mesh结构中通过Sidecar完成负载均衡、路由等操作,但是存在链路的性能损耗⼤,现有系统迁移繁琐等问题。 Dubbo3 引⼊Proxyless Mesh,直接和I控制⾯交互[istio]通信。集成 ServiceMesh更为⽅便,效率更高。
JDK使用了两种JDK:JDK8和JDK17
Maven:3.8.7
Dubbo:3.2.0
1. JDK8 与 Dubbo3.1.x以前的版本匹配,在使⽤Zookeeper注册作为注册中⼼时,消费者会出现节点已经存在的异常
https://github.com/apache/dubbo/issues/11077
2. JDK17 与 Dubbo3.1.x之前的版本搭配使⽤会出现如下问题
a. JDK9之后的深反射问题,需要通过JVM参数配置解决
-Dio.netty.tryReflectionSetAccessible=true
--add-opens
java.base/jdk.internal.misc=ALL-UNNAMED
--add-opens
java.base/java.nio=ALL-UNNAMED
--add-opens
java.base/java.lang=ALL-UNNAMED
b. Dubbo3.2.0.beat4以前的版本使⽤的是Spring5.2.x 不能⽀持 JDK17
会产⽣如下异常
Unsupported class file major version 61 【major 61 对应 17 】
版本需要升级到Dubbo3.2.0.beat5以上版本
父项目pom.xml的依赖
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.22version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.32version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.2.9version>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubboartifactId>
<version>3.2.0version>
dependency>
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private String name;
private String password;
}
public interface UserService {
public boolean login(String name,String password);
}
<dependencies>
<dependency>
<groupId>com.sjdwzgroupId>
<artifactId>dubbo-01-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
dependencies>
public class UserServiceImpl implements UserService{
@Override
public boolean login(String name, String password) {
System.out.println("UserServiceImpl.login name "+name + " password "+password);
return false;
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-02-provider"/>
<dubbo:protocol name="dubbo" port="20880"/>
<bean id="userService" class="com.sjdwz.service.UserServiceImpl"/>
<dubbo:service interface="com.sjdwz.service.UserService" ref="userService"/>
beans>
运行起来发现,会导出一个url
dubbo://192.168.96.1:20880/com.sjdwz.service.UserService
<dependencies>
<dependency>
<groupId>com.sjdwzgroupId>
<artifactId>dubbo-01-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
dependencies>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-03-consuemer" />
<dubbo:reference interface="com.sjdwz.service.UserService" id="userService"
url="dubbo://192.168.96.1:20880/com.sjdwz.service.UserService"/>
beans>
启动起来就可以看到消费端和生产端相应的输出。
消费端会有一个异常
16:40:41.156 [main] ERROR org.apache.dubbo.qos.server.Server - [DUBBO] qos-server can not bind localhost:22222, dubbo version: 3.2.0, current host: 192.168.96.1, error code: 7-4. This may be caused by , go to https://dubbo.apache.org/faq/7/4 to find instructions.
问题产生的原因:
Qos=Quality of Service,qos是Dubbo的在线运维命令,可以对服务进⾏动态的配置、控制及查询,Dubboo2.5.8新版本重构了telnet(telnet是从Dubbo2.0.5开始⽀持的)模块,提供了新的telnet命令支持,新版本的telnet端⼝与dubbo协议的端⼝是不同的端⼝,默认为22222。正是因为这个问题:如果在⼀台服务器里面,启动provider是22222端⼝,⽽consumer启动时就会报错了。
xml解决方案
boot解决方案
dubbo.application.qos.enable=true
dubbo.application.qos.port=33333
dubbo.application.qos.accept.foreign.ip=false
provider基于dubbo协议 默认的端⼝是20880
但是随着应⽤数量过⼤如果显示指定协议端⼝,会容易造成端⼝冲突所以建议按照如下写法设置
端⼝
应用程序运行过程浅析
为什么provider提供了UserService的实现,而在另一个JVM中的consumer中可以调用?Consumer中调用的到底是什么?
实际上调用的是远端UserServiceImpl的代理对象 Proxy
代理的核心工作是什么?
被consumer实际调用,通过代理对consumer屏蔽网络通信的过程(通信方式、协议、序列化),数据传递。
深度封装,把公⽤的配置放置到application.yml中,把个性的配置应⽤注解进⾏设置。
创建新的module
再引入api模块和dubbo-starter
<dependency>
<groupId>com.sjdwzgroupId>
<artifactId>dubbo-01-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>3.2.0version>
dependency>
创建applicaion.yml;将公共的配置放到这里面:
个性化的配置使用注解来完成;
启动类上加**@EnableDubbo**注解:
再引入api模块和dubbo-starter
<dependency>
<groupId>com.sjdwzgroupId>
<artifactId>dubbo-01-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>3.2.0version>
dependency>
创建applicaion.yml;将公共的配置放到这里面:
在启动类中加上注解
在测试类中进行测试:
@SpringBootTest
class Dubbo05BootConsumerApplicationTests {
//url是刚才输出的url
@DubboReference(url = "dubbo://192.168.96.1:20880/com.sjdwz.service.UserService")
private UserService userService;
@Test
public void test1() {
boolean ret = userService.login("sjdwz", "123456");
System.out.println("ret = " + ret);
}
}