SpringBoot+Dubbo整合
一、创建用户微服务
1、新建SpringBoot jar工程
创建SpringBoot项目。支持SSM+Thymeleaf模版页面。
实现功能:
根据用户ID查询用户信息
2、完整POM.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.qfjy</groupId>
<artifactId>boot-user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-user-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- spring web mvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!-- mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- druid 数据源连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 支持非严格语法的neko -->
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Swagger2 Begin -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
<!-- Swagger2 End -->
</dependencies>
3、application.yml
#server config info
server:
port: 8080
servlet:
context-path: /boot-user-service
spring:
#thymeleaf info
thymeleaf:
encoding: UTF-8
cache: false
prefix: classpath:/templates/
suffix: .html
mode: LEGACYHTML5
servlet:
content-type: text/html
#datasource connect info
datasource:
name: test
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://localhost:3306/qfdnj?serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
filters: stat
initial-size: 1
min-idle: 1
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
# mybatis config info
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.qfjy.bean
4、发送请求
http://localhost:8080/boot-user-service/user/1
{
"id": 1,
"name": "威风",
"email": "1",
"telephone": "17635296034",
"province": "北京市",
"city": "河南省",
"zone": "驻马店",
"rid": 1,
"status": 1,
"createdate": "2020-10-12 13:41:12",
"wid": 50
}
二、创建会议微服务
1、新建SpringBoot jar工程
创建SpringBoot项目。支持SSM+Thymeleaf模版页面。
实现功能:
根据会议编号,查询用户信息
三、服务最佳化实践
http://dubbo.apache.org/zh-cn/docs/user/best-practice.html
创建Maven普通jar项目:boot-interface-api
两个微服务分别引入依赖
引入依赖
<dependency>
<groupId>com.qfjy</groupId>
<artifactId>boot-interface-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
四、SpringBoot配置Dubbo
1、dubbo配置服务提供者
导入依赖
<!-- spring boot 整合dubbo
导入zookeeper-3.4.9.jar 同时还将curator-client.jar相关导入
-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
application.yml
# spring dubbo config
dubbo:
application:
name: boot-user-service
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
声明需要暴露的服务@Service
@com.alibaba.dubbo.config.annotation.Service
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
................
}
启动 EnableDubbo
@SpringBootApplication
@MapperScan(basePackages = {"com.qfjy.mapper"})
@EnableDubbo // 启动基于Dubbo注解功能
public class BootUserServiceApplication {
..............
}
2、dubbo配置服务消费者
导入依赖
<!-- spring boot 整合dubbo
导入zookeeper-3.4.9.jar 同时还将curator-client.jar相关导入
-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
application.yml
# spring dubbo config
dubbo:
application:
name: boot-user-service
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
dubbo:
application:
name: boot-meeting-service
registry:
address: zookeeper://127.0.0.1:2181
声明需要引用的服务@Reference
@Reference //声明引用的远程服务接口。在注册中心发现
private UserService userService;
启动 EnableDubbo
@SpringBootApplication
@MapperScan(basePackages = {"com.qfjy.mapper"})
@EnableDubbo
public class BootMeetingServiceApplication {
..............
}
新的需求:
根据用户的 手机号码 查询用户的余额信息。(显示当前用户信息)
1、根据用户手机号查询用户信息 (user-service)
2、根据手机号码查询余额信息(pay-service)
五、其它
1、启动时检查
Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"
。
可以通过 check="false"
关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false"
,总是会返回引用,当服务恢复时,能自动连上。
@Reference(check = false)
MeetingPubService meetingPubService;
2、 容错与屏蔽
容错
顾名思义就是当服务提供者出现异常时,消费者是否能够正常处理,在这里,我们关闭掉服务提供者,再进行调用,观察是否会报错
可以观察到前端报异常了。
我们进入dubbo-admin在消费者中把服务容错开启,如下
再进行调用可以看到返回为null 容错配置生效
屏蔽
当对某个服务启动屏蔽时,此时消费者调用该服务时均会返回空对象。首先我们需要确保提供者与消费者均已启动,然后在消费者中对提供者进行屏蔽,如下图
自定义
其实屏蔽与容错还有更高级的配置。基本的屏蔽是返回空对象,我们甚至可以自定义返回内容。
进入动态配置,选择新增
再次访问网页。
屏蔽成功,并返回我们自定义的内容。此时并未调用到提供者服务。
六、 高可用场景
1、现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务
原因:
健壮性
监控中心宕掉不影响使用,只是丢失部分采样数据
数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
服务提供者无状态,任意一台宕掉后,不影响使用
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
2、DUBBO直连
七、负载均衡
dubbo提供了三个基本的负载均衡策略,分别是 随机访问、轮询、最少并发,一致性hash等。
http://dubbo.apache.org/zh-cn/docs/user/demos/loadbalance.html
演示一下轮询的负载均衡策略。在dubbo-admin中,选择负载均衡功能,
查询,但不能注册新服务
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
服务提供者无状态,任意一台宕掉后,不影响使用
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复