当前位置:   article > 正文

SpringBoot整合dubbo+zooker搭建分布式服务(超详细)_springboot+dubbo分布式项目

springboot+dubbo分布式项目

一、Dubbo简介

1.dubbo是什么

2.dubbo基本工作原理

3.具体介绍参考官方文档

二、准备dubbo-admin(管理控制台)和zookeeper(注册中心)

1.下载安装zookeeper注册中心

2.下载安装dubbo-admin(dubbo的管理控制台)

三、SpringBoot整合dubbo+zooker

1.项目整体架构与思路

2.具体实现

四、总结


 

一、Dubbo简介

1.dubbo是什么

Apache Dubbo 是一款微服务开发框架,它提供了 RPC通信与微服务治理两大关键能力。这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力,同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。同时Dubbo 是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。

2.dubbo基本工作原理

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

  • Contaniner:容器
  • Provider:服务提供者
  • Consumer:服务消费者
  • Registry:注册中心
  • Monitor:统计服务调用次数和调用时间的监控中心

3.具体介绍参考官方文档

文档 | Apache Dubbo

二、准备dubbo-admin(管理控制台)和zookeeper(注册中心)

1.下载安装zookeeper注册中心

zookeeper官网:https://zookeeper.apache.org/

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

下载安装后复制conf目录下的zoo_sample.cfg文件,改名为zoo.cfg,并修改配置

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

默认8080端口启动,这里添加admin.serverPort=9999将启动端口改成9999,防止端口占用

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

然后打开bin目录下的zkServer.cmd,启动zookeeper服务端

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 启动成功页面

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

2.下载安装dubbo-admin(dubbo的管理控制台)

 进入官网导航的GitHub,下滑找到Dubbo-admin分支并进入

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 直接下载zip安装包

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 安装后进入dubbo-admin-master目录找到dubbo-admin-server

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

将dubbo-admin-server打成jar包,两种方式选择

(1)maven命令打包:cmd窗口切换到根目录用mvn clean package+项目名打包

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

(2)IDEA中maven打包:用IDEA打开dubbo-admin-server项目,用maven插件package打包

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

打好jar包后,推荐复制放在dubbo、zookeeper根目录下

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

用cmd命令行切换到当前目录,使用java -jar+包名 运行

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

如果没有报错的话,此时dubbo-admin的服务端已经启动了,由于dubbo的管理控制台是个前后端分离的项目,我们还需要让前端服务也跑起来:

进入到dubbo-admin-master目录找到dubbo-ui

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 打开命令行切换到当前目录,先执行下npm install命令,然后用npm run serve运行项目

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 此时前端也已经跑起来了,我们可以直接用前端的url http://localhost:8082/进入控制台

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 默认账号密码都是root,在dubbo-admin-master的配置文件application.properties中

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 application.properties配置文件

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

登录成功后的页面

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

三、SpringBoot整合dubbo+zooker

1.项目整体架构与思路

分布式微服务主要是将应用的各项功能拆分成不同的模块,(根据不同的功能模块划分成不同的项目)发布在不同的服务器上,然后将需要向外提供的服务api做成分包,模块之间的相互调用通过分包api完成,dubbo的作用在于我们只需要将服务提供者的接口暴露给dubbo托管,服务消费者只要向registry注册中心注册并指定需要调用的服务,即可完成服务间调用,无需关心服务提供者的内部结构是怎样的,用户也感知不到调用了任何外部服务。

项目工程结构

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

整体思路

这里主要模拟实现用户和会话的功能,用户模块主要负责对用户信息的管理,而一个用户则可以对于多个聊天会话,现在的需求是需要通过id查询用户的信息,并查询该用户所有的会话。在此实例中,则用户服务(user-service)是服务消费者(consumer),会话服务是服务提供者(provider)。

2.具体实现

(1)创建一个空项目(主要作为容器)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

(2)创建分包api(用于整合服务提供者和消费者)

创建一个maven的quickstart模板项目即可

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

这里命名为data-api

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

导入依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>4.11</version>
  6. <scope>test</scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.projectlombok</groupId>
  10. <artifactId>lombok</artifactId>
  11. <version>1.18.22</version>
  12. </dependency>
  13. </dependencies>

将功能所需要的实体和接口都定义在这个项目里,后面服务的提供者和消费者只需要关注具体实现即可

创建实体类

  1. package com.api.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.io.Serializable;
  6. import java.util.List;
  7. @Data
  8. @AllArgsConstructor
  9. @NoArgsConstructor
  10. public class User implements Serializable {
  11. private long user_id;
  12. private String username;
  13. private String password;
  14. private Boolean online_status;
  15. private String create_time;
  16. private Integer user_status;
  17. private List<Chat> chatList;
  18. }
  1. package com.api.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.io.Serializable;
  6. import java.util.List;
  7. @Data
  8. @AllArgsConstructor
  9. @NoArgsConstructor
  10. public class Chat implements Serializable {
  11. private long chat_id;
  12. private String chat_status;
  13. private String chat_name;
  14. private Integer chat_type;
  15. private String create_time;
  16. private long creator_id;
  17. private long to_id;
  18. private Boolean is_deleted;
  19. private String last_send_time;
  20. private String last_message;
  21. }

对应的数据表

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

定义接口

  1. package com.api.service;
  2. import com.api.entity.Chat;
  3. import java.util.List;
  4. public interface ChatService {
  5. List<Chat> findChatByUser(long user_id);
  6. }
  1. package com.api.service;
  2. import com.api.entity.User;
  3. public interface UserService {
  4. User findUserById(long user_id);
  5. User findInfoById(long user_id);
  6. }

整体结构

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_19,color_FFFFFF,t_70,g_se,x_16

 

(3)创建会话服务项目(提供者)

在空项目中创建module

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

选择springboot的模板即可

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

项目配置

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 依赖选择,我这里选了lombok和webwatermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 项目命名,我这里命名为chat-service

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 创建成功后,导入依赖(注意记得把刚才创建的分包api maven依赖导进来)

注意:这里dubbo和zookeeper的版本一定要匹配,不然整合了跑不起来噢

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.projectlombok</groupId>
  8. <artifactId>lombok</artifactId>
  9. <optional>true</optional>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-test</artifactId>
  14. <scope>test</scope>
  15. </dependency>
  16. <!-- 数据库-->
  17. <dependency>
  18. <groupId>org.mybatis.spring.boot</groupId>
  19. <artifactId>mybatis-spring-boot-starter</artifactId>
  20. <version>2.2.2</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>mysql</groupId>
  24. <artifactId>mysql-connector-java</artifactId>
  25. <version>8.0.20</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.alibaba</groupId>
  29. <artifactId>druid</artifactId>
  30. <version>1.2.1</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>log4j</groupId>
  34. <artifactId>log4j</artifactId>
  35. <version>1.2.17</version>
  36. </dependency>
  37. <!-- Dubbo Spring Boot Starter -->
  38. <dependency>
  39. <groupId>org.apache.dubbo</groupId>
  40. <artifactId>dubbo-spring-boot-starter</artifactId>
  41. <version>2.7.8</version>
  42. </dependency>
  43. <dependency><!--zookerper版本一定要匹配! -->
  44. <groupId>org.apache.dubbo</groupId>
  45. <artifactId>dubbo-registry-zookeeper</artifactId>
  46. <version>2.7.8</version>
  47. </dependency>
  48. <!--这个是分包api的maven依赖-->
  49. <dependency>
  50. <groupId>org.example</groupId>
  51. <artifactId>data-api</artifactId>
  52. <version>1.0-SNAPSHOT</version>
  53. </dependency>
  54. </dependencies>

配置durid连接池

  1. package com.chat.config;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import javax.sql.DataSource;
  7. @Configuration
  8. public class DruidConfig {
  9. /*
  10. 将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
  11. 绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
  12. @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
  13. 前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
  14. */
  15. @ConfigurationProperties(prefix = "spring.datasource")
  16. @Bean
  17. public DataSource druidDataSource() {
  18. return new DruidDataSource();
  19. }
  20. }

创建mapper接口

  1. package com.chat.mapper;
  2. import com.api.entity.Chat;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import org.apache.ibatis.annotations.Param;
  5. import org.springframework.stereotype.Repository;
  6. import java.util.List;
  7. @Mapper
  8. @Repository
  9. public interface ChatMapper {
  10. List<Chat> findChatByUser(@Param("user_id") long user_id);
  11. }

在resource目录下创建MyBatis的mapper.xml文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.chat.mapper.ChatMapper">
  6. <select id="findChatByUser" resultType="Chat">
  7. SELECT * FROM chat WHERE creator_id=#{user_id}
  8. UNION SELECT * FROM chat WHERE to_id=#{user_id}
  9. </select>
  10. </mapper>

创建ChatService实现类

这里dubbo主要的注解是@DubboService 用于将服务暴露给dubbo

  1. package com.chat.service;
  2. import com.api.entity.Chat;
  3. import com.api.service.ChatService;
  4. import com.chat.mapper.ChatMapper;
  5. import org.apache.dubbo.config.annotation.DubboService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import java.util.List;
  9. @Service
  10. @DubboService//将服务暴露给dubbo
  11. public class ChatServiceImpl implements ChatService {
  12. @Autowired
  13. private ChatMapper chatMapper;
  14. @Override
  15. public List<Chat> findChatByUser(long user_id) {
  16. return chatMapper.findChatByUser(user_id);
  17. }
  18. }

配置启动类,一定要加上@EnableDubbo注解,用于将dubbo相关的配置bean加载到spring容器

  1. package com.chat;
  2. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  3. import org.mybatis.spring.annotation.MapperScan;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. @SpringBootApplication
  7. @MapperScan("com.chat.mapper")
  8. @EnableDubbo//打开dubbo
  9. public class DemoApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(DemoApplication.class, args);
  12. }
  13. }

修改yml配置文件

  1. spring:
  2. datasource:
  3. username: root
  4. password: 123456
  5. url: jdbc:mysql://localhost:3306/spring_im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. type: com.alibaba.druid.pool.DruidDataSource
  8. initialSize: 5
  9. minIdle: 5
  10. maxActive: 20
  11. maxWait: 60000
  12. timeBetweenEvictionRunsMillis: 60000
  13. minEvictableIdleTimeMillis: 300000
  14. validationQuery: SELECT 1 FROM DUAL
  15. testWhileIdle: true
  16. testOnBorrow: false
  17. testOnReturn: false
  18. poolPreparedStatements: true
  19. filters: stat,wall,log4j
  20. maxPoolPreparedStatementPerConnectionSize: 20
  21. useGlobalDataSourceStat: true
  22. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  23. server:
  24. port: 8882
  25. mybatis:
  26. type-aliases-package: com.api.entity
  27. mapper-locations: mappers/*.xml
  28. dubbo:
  29. application:
  30. name: chat-service
  31. registry:
  32. protocol: zookeeper
  33. address: 127.0.0.1:2181
  34. protocol:
  35. name: dubbo
  36. port: 20884

会话服务项目结构

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_12,color_FFFFFF,t_70,g_se,x_16

 (4)创建用户服务项目(消费者)

创建项目的过程同上,创建成功后,先导依赖,再配置durid数据连接池(同上)

创建mapper接口

  1. package com.user.mapper;
  2. import com.api.entity.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import org.apache.ibatis.annotations.Param;
  5. import org.springframework.stereotype.Repository;
  6. @Mapper
  7. @Repository
  8. public interface UserMapper {
  9. User findUserById(@Param("user_id")long user_id);
  10. }

在resource目录下创建MyBatis的mapper.xml文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.user.mapper.UserMapper">
  6. <select id="findUserById" resultType="User">
  7. SELECT * FROM user WHERE user_id=#{user_id}
  8. </select>
  9. </mapper>

创建UserService实现类,主要的注解是@DubboReference,用于指定需要调用(依赖)的服务

  1. package com.user.service;
  2. import com.api.entity.User;
  3. import com.api.service.ChatService;
  4. import com.api.service.UserService;
  5. import com.user.mapper.UserMapper;
  6. import org.apache.dubbo.config.annotation.DubboReference;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Service;
  9. @Service
  10. public class UserServiceImpl implements UserService {
  11. @Autowired
  12. private UserMapper userMapper;
  13. @DubboReference
  14. private ChatService chatService;
  15. @Override
  16. public User findUserById(long user_id) {
  17. return userMapper.findUserById(user_id);
  18. }
  19. @Override
  20. public User findInfoById(long user_id) {
  21. User user=userMapper.findUserById(user_id);
  22. user.setChatList(chatService.findChatByUser(user_id));
  23. return user;
  24. }
  25. }

创建UserController,用于测试服务

  1. package com.user.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.api.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RequestMapping("/user")
  8. @RestController
  9. public class UserController {
  10. @Autowired
  11. private UserService userService;
  12. @RequestMapping("/queryUser")
  13. public String queryUser(long user_id){
  14. return JSONObject.toJSONString(userService.findUserById(user_id));
  15. }
  16. @RequestMapping("/queryUserChat")
  17. public String queryUserChat(long user_id){
  18. return JSONObject.toJSONString(userService.findInfoById(user_id));
  19. }
  20. }

配置启动类

  1. package com.user;
  2. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  3. import org.mybatis.spring.annotation.MapperScan;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. @SpringBootApplication
  7. @MapperScan("com.user.mapper")
  8. @EnableDubbo
  9. public class DemoApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(DemoApplication.class, args);
  12. }
  13. }

配置yml文件

  1. spring:
  2. datasource:
  3. username: root
  4. password: 123456
  5. url: jdbc:mysql://localhost:3306/spring_im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. type: com.alibaba.druid.pool.DruidDataSource
  8. initialSize: 5
  9. minIdle: 5
  10. maxActive: 20
  11. maxWait: 60000
  12. timeBetweenEvictionRunsMillis: 60000
  13. minEvictableIdleTimeMillis: 300000
  14. validationQuery: SELECT 1 FROM DUAL
  15. testWhileIdle: true
  16. testOnBorrow: false
  17. testOnReturn: false
  18. poolPreparedStatements: true
  19. filters: stat,wall,log4j
  20. maxPoolPreparedStatementPerConnectionSize: 20
  21. useGlobalDataSourceStat: true
  22. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  23. server:
  24. port: 8882
  25. mybatis:
  26. type-aliases-package: com.api.entity
  27. mapper-locations: mappers/*.xml
  28. dubbo:
  29. application:
  30. name: user-service
  31. registry:
  32. protocol: zookeeper
  33. address: 127.0.0.1:2181
  34. protocol:
  35. name: dubbo
  36. port: 20885

user-service项目结构

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_13,color_FFFFFF,t_70,g_se,x_16

至此,所有准备工作搭建完成,启动两个项目即可(建议先启动服务提供者,再启动消费者)

 启动chat-service(前提:zookeeper服务端已经运行,建议dubbo-admin前后端也跑起来)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

启动后可以在dubbo-admin控制台查看

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

启动user-service 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

此时服务提供者和消费者都已经ok了,可以测试下功能

访问一下http://localhost:8881/user/queryUser?user_id=1 仅查询用户信息

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

 访问http://localhost:8881/user/queryUserChat?user_id=1 查询用户和用户的会话信息

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aG-5rGQ6L6w,size_20,color_FFFFFF,t_70,g_se,x_16

四、总结

在user-service项目里面我们成功的调用了chat-service里面的查询会话服务,如果不是分布式微服务的项目,我们通常会将这两个功能写一起,内部相互调用,耦合性比较高。如果其中任何一个环节出了问题,那整个应用都将无法使用。而在本项目中,我们将业务做了拆分,而用户是感知不到的,单个环节出现问题并不影响另一个模块功能的使用,同时也为我们开发高并发、高可用、分布式的应用服务提供了快速高效的解决方案。使用 Dubbo 构建的微服务遵循云原生思想,能更好的复用底层云原生基础设施、贴合云原生微服务架构。创作不易,觉得有用的话点个赞吧!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/166061?site
推荐阅读
相关标签
  

闽ICP备14008679号