企业建网站有这个必要吗,saas建站系统是怎么实现的,织梦网站被攻击,网站建设美文Dubbo3程序的初步开发
Dubbo3升级的核心内容 易⽤性 开箱即⽤#xff0c;易⽤性⾼#xff0c;如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富#xff0c;基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能⼒。更加完善了多语言支持#xff08;GO PYTHON R…Dubbo3程序的初步开发
Dubbo3升级的核心内容 易⽤性 开箱即⽤易⽤性⾼如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能⼒。更加完善了多语言支持GO PYTHON RUST) 超⼤规模微服务实践 ⾼性能通信Triple GRPC)⾼可扩展性 (SPI 多种序列化⽅式 多种协议)丰富的服务治理能⼒超⼤规模集群实例⽔平扩展 云原生友好 容器调度平台Kubernetes 将服务的组织与注册交给底层容器平台如 Kubernetes这是更云原 ⽣的⽅式。 Service Mesh 原有Mesh结构中通过Sidecar完成负载均衡、路由等操作但是存在链路的性能损耗⼤现有系统迁移繁琐等问题。 Dubbo3 引⼊Proxyless Mesh直接和I控制⾯交互[istio]通信。集成 ServiceMesh更为⽅便效率更高。
Dubbo3前言
代码结构及其术语解释
provider 功能提供者consumer 功能调⽤者【功能消费者】commons-api 通⽤内容 entity service接口registry 注册中⼼ 可选⽤于管理provider集群 开发步骤
开发commons-api 通⽤内容开发provider 功能提供者开发 consumer 功能调⽤者【功能消费者】如需要注册中心开发registry 注册中⼼
本专题所使用软件版本
JDK使用了两种JDKJDK8和JDK17
Maven:3.8.7
Dubbo:3.2.0
JDK与Dubbo版本的关系
1. JDK8 与 Dubbo3.1.x以前的版本匹配在使⽤Zookeeper注册作为注册中⼼时消费者会出现节点已经存在的异常https://github.com/apache/dubbo/issues/11077
2. JDK17 与 Dubbo3.1.x之前的版本搭配使⽤会出现如下问题a. JDK9之后的深反射问题需要通过JVM参数配置解决-Dio.netty.tryReflectionSetAccessibletrue--add-opensjava.base/jdk.internal.miscALL-UNNAMED--add-opensjava.base/java.nioALL-UNNAMED--add-opensjava.base/java.langALL-UNNAMEDb. Dubbo3.2.0.beat4以前的版本使⽤的是Spring5.2.x 不能⽀持 JDK17会产⽣如下异常Unsupported class file major version 61 【major 61 对应 17 】版本需要升级到Dubbo3.2.0.beat5以上版本基于XML的Dubbo3程序开发
环境搭建 父项目pom.xml的依赖
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.22/version
/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.32/version
/dependencydependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.9/version
/dependencydependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo/artifactIdversion3.2.0/version
/dependency首先开发公共模块-api模块
实体entity
Data
ToString
NoArgsConstructor
AllArgsConstructor
public class User implements Serializable {private String name;private String password;
}接口service
public interface UserService {public boolean login(String name,String password);
}开发provider模块
在provider模块添加依赖
dependenciesdependencygroupIdcom.sjdwz/groupIdartifactIddubbo-01-api/artifactIdversion1.0-SNAPSHOT/version/dependency
/dependencies实现接口
public class UserServiceImpl implements UserService{Overridepublic boolean login(String name, String password) {System.out.println(UserServiceImpl.login name name password password);return false;}
}创建Spring配置文件配置Dubbo相关内容使得UserServiceImpl可以跨虚拟机来调用 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dubbohttp://dubbo.apache.org/schema/dubboxsi:schemaLocationhttp://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 namedubbo-02-provider/!-- 设置rpc相关的协议 使得可以网络通信 --dubbo:protocol namedubbo port20880/!-- 创建对象 --bean iduserService classcom.sjdwz.service.UserServiceImpl/!-- 发布dubbo服务 --dubbo:service interfacecom.sjdwz.service.UserService refuserService//beansSpring工厂启动类 运行起来发现会导出一个url dubbo://192.168.96.1:20880/com.sjdwz.service.UserService开发consumer模块
引入api模块依赖
dependenciesdependencygroupIdcom.sjdwz/groupIdartifactIddubbo-01-api/artifactIdversion1.0-SNAPSHOT/version/dependency
/dependencies创建Spring配置文件 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dubbohttp://dubbo.apache.org/schema/dubboxsi:schemaLocationhttp://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 namedubbo-03-consuemer /!-- 获取远端服务url就是刚才导出的url--dubbo:reference interfacecom.sjdwz.service.UserService iduserServiceurldubbo://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. 问题产生的原因
QosQuality of Serviceqos是Dubbo的在线运维命令可以对服务进⾏动态的配置、控制及查询Dubboo2.5.8新版本重构了telnettelnet是从Dubbo2.0.5开始⽀持的模块提供了新的telnet命令支持新版本的telnet端⼝与dubbo协议的端⼝是不同的端⼝默认为22222。正是因为这个问题如果在⼀台服务器里面启动provider是22222端⼝⽽consumer启动时就会报错了。xml解决方案
dubbo:parameter keyqos.enable valuetrue/ !--
是否开启在线运维命令 --
dubbo:parameter keyqos.accept.foreign.ip valuefalse/ !--
不允许其他机器的访问 --
dubbo:parameter keyqos.port value33333/ !--
修改port--boot解决方案
dubbo.application.qos.enabletrue
dubbo.application.qos.port33333
dubbo.application.qos.accept.foreign.ipfalse细节补充
协议、端口
provider基于dubbo协议 默认的端⼝是20880
dubbo:protocol namedubbo port20880/
但是随着应⽤数量过⼤如果显示指定协议端⼝会容易造成端⼝冲突所以建议按照如下写法设置
端⼝
dubbo:protocol namedubbo port-1/应用程序运行过程浅析 为什么provider提供了UserService的实现而在另一个JVM中的consumer中可以调用Consumer中调用的到底是什么 实际上调用的是远端UserServiceImpl的代理对象 Proxy 代理的核心工作是什么 被consumer实际调用通过代理对consumer屏蔽网络通信的过程通信方式、协议、序列化数据传递。
基于SpringBoot的方式使用Dubbo
SpringBoot应用Dubbo开发应用的核心思路分析
深度封装把公⽤的配置放置到application.yml中把个性的配置应⽤注解进⾏设置。
provider的处理 consumer的处理 编码开发
provider模块
创建新的module 再引入api模块和dubbo-starter
dependencygroupIdcom.sjdwz/groupIdartifactIddubbo-01-api/artifactIdversion1.0-SNAPSHOT/version
/dependency
dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion3.2.0/version
/dependency创建applicaion.yml将公共的配置放到这里面 个性化的配置使用注解来完成 启动类上加**EnableDubbo**注解 consumer模块 再引入api模块和dubbo-starter
dependencygroupIdcom.sjdwz/groupIdartifactIddubbo-01-api/artifactIdversion1.0-SNAPSHOT/version
/dependency
dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion3.2.0/version
/dependency创建applicaion.yml将公共的配置放到这里面 在启动类中加上注解 在测试类中进行测试
SpringBootTest
class Dubbo05BootConsumerApplicationTests {//url是刚才输出的urlDubboReference(url dubbo://192.168.96.1:20880/com.sjdwz.service.UserService)private UserService userService;Testpublic void test1() {boolean ret userService.login(sjdwz, 123456);System.out.println(ret ret);}
}EnableDubbo注解的作用
EnableDubbo ⽤于扫描DubboService并把对应的对象实例化、发布成RPC服务。扫描的路径应⽤这个注解的类启动类所在的包及其子包。如果DubboService注解修饰的类没有放到EnableDubbo注解修饰类当前包及其⼦包还希望能够扫描到它该如何处理 可以通过DubboComponentScan(basePackages {“org.sjdwz.service”})显示的指定扫描的路径yml进⾏配置扫描DubboService 并把对应的对象实例化发布成RPC服务。 dubbo.scan.base-packages 等同于 EnableDubbo
DubboService注解的作用
应⽤DubboService注解修饰类型SpringBoot会创建这个类型的对象并发布成Dubbo服务。DubboService 等同于 Component(Service) Bean注解的创建对象的作⽤。 通过源码SingletonObjects可以验证DubboService a. 创建对象 等同于 Component(Service) Bean b. 发布成RPC服务后续开发过程中如果考虑兼容性建议实现类不仅仅要加⼊DubboService注解同时也要加⼊Service注解
DubboReference注解的作用
在Consumer端通过DubboReference注⼊远端服务的代理对象。DubboReference类似于原始Spring开发中Autowired注解的作⽤。