Apache Dubbo 中文
Dubbo3实战开发一套通:分布式微服务解决方案、全方位一网打尽|Nacos、gRPC、Triple、Consul、Zookeeper、SpringCloud_哔哩哔哩_bilibili
官⽅⽹站:
Apache Dubbo 中文
GitHub :
GitHub - apache/dubbo: The java implementation of Apache Dubbo. An RPC and microservice framework.
时⾄今⽇,SOA与微服务架构基本可以统⼀成⼀个概念了。
优点:
缺点:
优点:
缺点:
优点:
缺点:
优点:
缺点:
SOA架构是RPC架构的演化。代表框架Dubbo
SOA(面向服务的架构)是一种设计方法,将软件系统划分为多个独立的、可重用的服务,这些服务通过标准化的接口进行通信和交互。
特点:
优点:
缺点:
微服务是SOA架构的升级,在微服务体系统中,没有⼦系统了,全部都是服务化功能。微服务架构代表框架,SpringCloud, DNS(Dubbo+Nacos+Sentinel)
微服务架构是一种软件架构模式,将应用程序设计为一组小型、自治的服务单元,每个服务专注于完成特定的业务功能。这些服务可以独立开发、部署、扩展和管理,通过轻量级通信机制(如HTTP或消息队列)相互协作,共同构建一个大型复杂的应用系统。
特点:
优点:
挑战:
● **易⽤性 **
开箱即⽤易⽤性⾼,如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富,基于原⽣库或轻量扩展即可实现绝⼤多数的微服务治理能⼒。更加完善了多语⾔⽀持(GO PYTHON RUST)
● 超⼤规模微服务实践 **
○ ⾼性能通信(Triple GRPC)
○ ⾼可扩展性 (SPI 多种序列化⽅式 多种协议)
○ 丰富的服务治理能⼒
○ 超⼤规模集群实例⽔平扩展
● 云原⽣ **
○ 容器调度平台(Kubernetes)
将服务的组织与注册交给底层容器平台,如 Kubernetes,这是更云原⽣的⽅式。
○ Service Mesh
原有Mesh结构中通过Sidecar完成负载均衡、路由等操作,但是存在链路的性能损耗⼤,现有系统迁移繁琐等问题。 Dubbo3 引⼊Proxyless Mesh,直接和I控制⾯交互[istio]通信。集成ServiceMesh更为⽅便,效率更⾼。
阿⾥巴巴【电商系统的考拉、交易平台,饿了么、钉钉】、携程、⼯商银⾏、中 国⼈寿、海尔、⾦蝶、⽃⻥、⼩⽶、京东…
-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以上版本
xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shu</groupId>
<artifactId>SpringMvc-Dubbo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>Dubbo-Provider</module>
<module>Dubbo-Consumer</module>
<module>Dubbo-Api</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<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>
</dependencies>
</project>
package com.shu.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
/**
* @author : EasonShu
* @date : 2023/11/19 12:34
* @Version: 1.0
* @Desc : 用户实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable {
private String name;
private String password;
private String email;
private String phone;
}
package com.shu.service;
import com.shu.model.User;
/**
* @author : EasonShu
* @date : 2023/11/19 12:35
* @Version: 1.0
* @Desc : 用户服务接口
*/
public interface UserService {
// 通过用户名查询用户信息
User queryUserByName(String name);
// 保存用户信息
void saveUser(User user);
}
引入公共依赖
<dependency>
<groupId>com.shu</groupId>
<artifactId>Dubbo-Api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
编写服务接口实现类
package com.shu.service;
import com.shu.model.User;
import com.sun.istack.internal.NotNull;
import lombok.extern.slf4j.Slf4j;
/**
* @author : EasonShu
* @date : 2023/11/19 12:37
* @Version: 1.0
* @Desc :
*/
@Slf4j
public class UserServiceProvider implements UserService{
@Override
public User queryUserByName(String name) {
log.info("查询用户信息成功");
return new User("EasonShu", "123456", "[email protected]", "177134e59165");
}
@Override
public void saveUser(@NotNull User user) {
log.info("保存用户信息成功");
log.info("用户信息为:{}", user.toString());
}
}
编写SpringMvc配置文件:applicationContext-provider.xml
<?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:application name="DubbuoProvider"/>
<dubbo:protocol name="dubbo" port="-1" />
<bean id="UserService" class="com.shu.service.UserServiceProvider"/>
<dubbo:service interface="com.shu.service.UserService" ref="UserService"/>
</beans>
编写启动类
package com.shu;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.concurrent.CountDownLatch;
/**
* @author : EasonShu
* @date : 2023/11/19 12:40
* @Version: 1.0
* @Desc : Dubbo服务提供者启动类
*/
@EnableDubbo
public class DubboProviderApplication {
public static void main(String[] args) throws InterruptedException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-provider.xml");
applicationContext.start();
new CountDownLatch(1).await();
}
}
观察启动日志:ip信息 Dubbo Application1.1 is ready., dubbo version: 3.2.0, current host: 192.168.2.35
编写配置文件:applicationContext-consumer.xml
<?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:application name="Dubbo-consuemer">
<dubbo:parameter key="qos.enable" value="false"/>
</dubbo:application>
<dubbo:reference interface="com.shu.service.UserService" id="UserService"
url="dubbo://192.168.2.35:20880/com.shu.service.UserService"/>
</beans>
注意qos:
ERROR org.apache.dubbo.qos.server.Server
Address already in use
**问题产⽣的原因: **
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-->
yaml
dubbo.application.qos.enable=true
dubbo.application.qos.port=33333
dubbo.application.qos.accept.foreign.ip=false
package com.shu.service;
import com.shu.model.User;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
* @author : EasonShu
* @date : 2023/11/19 12:52
* @Version: 1.0
* @Desc :
*/
public class DubboConsumerApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-consumer.xml");
UserService userService = applicationContext.getBean(UserService.class);
System.out.println(userService.queryUserByName("EasonShu"));
userService.saveUser(new User("小米","123456", "", ""));
System.in.read();
}
}
provider基于dubbo协议 默认的端⼝是20880
<dubbo:protocol name="dubbo" port="20880"/>
但是随着应⽤数量过⼤如果显示指定协议端⼝,会容易造成端⼝冲突所以建议按照如下写法设置
端⼝
<dubbo:protocol name="dubbo" port="-1"/>
深度封装,把公⽤的配置放置到application.yml中,把个性的配置应⽤注解进⾏设置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.shu</groupId>
<artifactId>Dubbo-Provider-Boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Dubbo-Provider-Boot</name>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<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>
<dependency>
<groupId>com.shu</groupId>
<artifactId>Dubbo-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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring:
application:
name: DUBBO-PROVIDER-BOOT
dubbo:
protocol:
name: dubbo
port: -1
package com.shu.service;
import com.shu.model.User;
import com.sun.istack.internal.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
/**
* @author : EasonShu
* @date : 2023/11/19 12:37
* @Version: 1.0
* @Desc : Dubbo服务提供者
*/
@Slf4j
@Service
@DubboService
public class UserServiceProvider implements UserService{
@Override
public User queryUserByName(String name) {
log.info("查询用户信息成功");
return new User("EasonShu", "123456", "[email protected]", "177134e59165");
}
@Override
public void saveUser(@NotNull User user) {
log.info("保存用户信息成功");
log.info("用户信息为:{}", user.toString());
}
}
package com.shu;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.concurrent.CountDownLatch;
/**
* @author : EasonShu
* @date : 2023/11/19 12:40
* @Version: 1.0
* @Desc : Dubbo服务提供者启动类
*/
@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.shu</groupId>
<artifactId>Dubbo-Consumer-Boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>>Dubbo-Consumer-Boot</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>com.shu</groupId>
<artifactId>Dubbo-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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring:
application:
name: DUBBO-CONSUMER-BOOT
dubbo:
application:
qos-enable: false
package com.shu;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author : EasonShu
* @date : 2023/11/19 14:28
* @Version: 1.0
* @Desc :
*/
@SpringBootApplication
@EnableDubbo
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
package com.shu;
import com.shu.service.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author : EasonShu
* @date : 2023/11/19 14:29
* @Version: 1.0
* @Desc :
*/
@SpringBootTest
public class DubboConsumerApplicationTest {
@DubboReference(url = "dubbo://192.168.2.35:20880/com.shu.service.UserService")
private UserService userService;
@Test
public void test() {
System.out.println(userService.queryUserByName("EasonShu"));
}
@Test
public void test1() {
userService.saveUser(null);
}
}
@EnableDubbo注解的作⽤
@DubboService注解的作⽤
@DubboReference注解的作⽤