侧边栏壁纸
博主头像
威风博主等级

九万里风鹏正举,风休住,蓬舟吹取三山去。

  • 累计撰写 38 篇文章
  • 累计创建 23 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Spring

威风
2020-10-12 / 0 评论 / 0 点赞 / 102 阅读 / 7,171 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-11-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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中,选择负载均衡功能,

查询,但不能注册新服务

注册中心对等集群,任意一台宕掉后,将自动切换到另一台

注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯

服务提供者无状态,任意一台宕掉后,不影响使用

服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

0

评论区