易?性
开箱即?,易?性?,如 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/110772. 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以上版本
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
java.base/java.nio=ALL-UNNAMED
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.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version></dependency><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.32</version></dependency><dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.9</version></dependency><dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.2.0</version></dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.9</version>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.2.0</version>
@Data@ToString@NoArgsConstructor@AllArgsConstructorpublic class User implements Serializable { private String name; private String password;}
@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);}
public interface UserService {
public boolean login(String name,String password);
<dependencies> <dependency> <groupId>com.sjdwz</groupId> <artifactId>dubbo-01-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency></dependencies>
<dependencies>
<groupId>com.sjdwz</groupId>
<artifactId>dubbo-01-api</artifactId>
<version>1.0-SNAPSHOT</version>
</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; }}
public class UserServiceImpl implements UserService{
@Override
public boolean login(String name, String password) {
System.out.println("UserServiceImpl.login name "+name + " password "+password);
return false;
<?xml version="1.0" encoding="UTF-8"?><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起个名字,要做到唯一,可以被注册中心所管理 --> <dubbo:application name="dubbo-02-provider"/> <!-- 设置rpc相关的协议 使得可以网络通信 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- 创建对象 --> <bean id="userService" class="com.sjdwz.service.UserServiceImpl"/> <!-- 发布dubbo服务 --> <dubbo:service interface="com.sjdwz.service.UserService" ref="userService"/></beans>
<?xml version="1.0" encoding="UTF-8"?>
<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起个名字,要做到唯一,可以被注册中心所管理 -->
<dubbo:application name="dubbo-02-provider"/>
<!-- 设置rpc相关的协议 使得可以网络通信 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 创建对象 -->
<bean id="userService" class="com.sjdwz.service.UserServiceImpl"/>
<!-- 发布dubbo服务 -->
<dubbo:service interface="com.sjdwz.service.UserService" ref="userService"/>
</beans>
运行起来发现,会导出一个url
dubbo://192.168.96.1:20880/com.sjdwz.service.UserService
<?xml version="1.0" encoding="UTF-8"?><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服务名称 --> <dubbo:application name="dubbo-03-consuemer" /> <!-- 获取远端服务 url就是刚才导出的url --> <dubbo:reference interface="com.sjdwz.service.UserService" id="userService" url="dubbo://192.168.96.1:20880/com.sjdwz.service.UserService"/></beans>
<!-- 配置dubbo服务名称 -->
<dubbo:application name="dubbo-03-consuemer" />
<!-- 获取远端服务
url就是刚才导出的url
-->
<dubbo:reference interface="com.sjdwz.service.UserService" id="userService"
url="dubbo://192.168.96.1:20880/com.sjdwz.service.UserService"/>
启动起来就可以看到消费端和生产端相应的输出。
消费端会有一个异常
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启动时就会报错了。
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解决方案
<dubbo:parameter key="qos.enable" value="true"/> <!--是否开启在线运维命令 --><dubbo:parameter key="qos.accept.foreign.ip" value="false"/> <!--不允许其他机器的访问 --><dubbo:parameter key="qos.port" value="33333"/> <!--修改port-->
<dubbo:parameter key="qos.enable" value="true"/> <!--
是否开启在线运维命令 -->
<dubbo:parameter key="qos.accept.foreign.ip" value="false"/> <!--
不允许其他机器的访问 -->
<dubbo:parameter key="qos.port" value="33333"/> <!--
修改port-->
boot解决方案
dubbo.application.qos.enable=truedubbo.application.qos.port=33333dubbo.application.qos.accept.foreign.ip=false
dubbo.application.qos.enable=true
dubbo.application.qos.port=33333
dubbo.application.qos.accept.foreign.ip=false
provider基于dubbo协议 默认的端?是20880<dubbo:protocol name="dubbo" port="20880"/>但是随着应?数量过?如果显示指定协议端?,会容易造成端?冲突所以建议按照如下写法设置端?<dubbo:protocol name="dubbo" port="-1"/>
provider基于dubbo协议 默认的端?是20880
但是随着应?数量过?如果显示指定协议端?,会容易造成端?冲突所以建议按照如下写法设置
端?
<dubbo:protocol name="dubbo" port="-1"/>
应用程序运行过程浅析
为什么provider提供了UserService的实现,而在另一个JVM中的consumer中可以调用?Consumer中调用的到底是什么?
实际上调用的是远端UserServiceImpl的代理对象 Proxy
代理的核心工作是什么?
被consumer实际调用,通过代理对consumer屏蔽网络通信的过程(通信方式、协议、序列化),数据传递。
深度封装,把公?的配置放置到application.yml中,把个性的配置应?注解进?设置。
创建新的module
再引入api模块和dubbo-starter
<dependency> <groupId>com.sjdwz</groupId> <artifactId>dubbo-01-api</artifactId> <version>1.0-SNAPSHOT</version></dependency><dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.0</version></dependency>
<artifactId>dubbo-spring-boot-starter</artifactId>
创建applicaion.yml;将公共的配置放到这里面:
个性化的配置使用注解来完成;
启动类上加@EnableDubbo注解:
在启动类中加上注解
在测试类中进行测试:
@SpringBootTestclass 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); }}
@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);
原文链接:https://www.cnblogs.com/nicaicai/p/17715947.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728