搭建SpringCloud-Alibaba框架

ゝ一世哀愁。 2022-12-14 13:53 405阅读 0赞

简介

搭建基于SpringcloudAlibaba的分布式框架,注册中心以及服务消费订阅采用的是中间件 Nacos作为实现,服务与服务之间的调用采用的是dubbo的rpc协议,各模块通过 Nacos进行统一的配置管理(通过Nacos做配置中心),当并发进行http接口调用时,则是采用中间件Sentinel进行服务限流以及服务降级,http请求响应数据则是从数据库 mysql 中获取,最后通过springcloud的插件gateway进行路由转发。本篇将略微有点长,请耐心看完。

项目地址

Nacos、Sentinel安装与简介

sentinel流控及降级持久化:建议把这篇文章看完再看持久化

工程搭建:

1:父工程及子工程

1、创建一个Maven项目作为父工程

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70

src等没用的文件直接删除,只留关键的pom即可

20201014104757783.png

2、创建子工程(maven工程)alibaba-module、alibaba-server、alibaba-common

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 1

src等没用的文件直接删除,只留关键的pom即可

3、alibaba-module—Pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <artifactId>SpringCloudAlibaba-practice</artifactId>
  8. <groupId>com.jingshang</groupId>
  9. <version>1.0</version>
  10. </parent>
  11. <artifactId>alibaba-module</artifactId>
  12. <packaging>pom</packaging>
  13. <description>module模块</description>
  14. <modules>
  15. <module>admin-user-biz</module>
  16. <module>admin-user-api</module>
  17. <module>admin-role-api</module>
  18. <module>admin-role-biz</module>
  19. </modules>
  20. </project>

alibaba-module子工程:我用它来管理api接口、http接口

4、alibaba-server—Pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.jingshang</groupId>
  7. <artifactId>alibaba-server</artifactId>
  8. <packaging>pom</packaging>
  9. <version>1.0</version>
  10. <modules>
  11. <module>alibaba-gateway-server</module>
  12. </modules>
  13. </project>

alibaba-server子工程:我用它来管理路由转发、服务降级、限流等功能模块

5、alibaba-common—Pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <artifactId>SpringCloudAlibaba-practice</artifactId>
  8. <groupId>com.jingshang</groupId>
  9. <version>1.0</version>
  10. </parent>
  11. <artifactId>alibaba-common</artifactId>
  12. <packaging>pom</packaging>
  13. <description>common模块</description>
  14. <modules>
  15. <module>common-core</module>
  16. <module>common-code-generation</module>
  17. </modules>
  18. </project>

alibaba-common子工程:我通常用来整合安全框架、代码生成等公共功能模块

2:整合Nacos注册中心、服务提供者、配置中心。整合sentinel

服务提供者

在alibaba-module工程中中创建 admin-user-api、admin-user-biz等子工程

说明:api为对外开放的接口、biz为http接口,通俗的讲就是postman可调用的接口。远程调用我是用的dubbo的rpc协议来替代feign和ribbon

1、创建 admin-user-api 模块:右键alibaba-module->new->module->创建maven项目

构建Pom:pom

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <artifactId>alibaba-module</artifactId>
  8. <groupId>com.jingshang</groupId>
  9. <version>1.0</version>
  10. </parent>
  11. <artifactId>admin-user-api</artifactId>
  12. <packaging>jar</packaging>
  13. <description>user模块</description>
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. </project>

2、创建 admin-user-biz 模块:右键alibaba-module->new->module->创建springboot项目

构建Pom:pom

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.jingshang</groupId>
  6. <artifactId>admin-user-biz</artifactId>
  7. <version>1.0</version>
  8. <packaging>jar</packaging>
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>2.0.5.RELEASE</version>
  13. <relativePath/> <!-- lookup parent from repository -->
  14. </parent>
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  17. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  18. <java.version>1.8</java.version>
  19. </properties>
  20. <dependencies>
  21. <!-- 引入Api -->
  22. <dependency>
  23. <groupId>com.jingshang</groupId>
  24. <artifactId>admin-user-api</artifactId>
  25. <version>1.0</version>
  26. </dependency>
  27. <!-- 公共Api-->
  28. <dependency>
  29. <groupId>com.jingshang</groupId>
  30. <artifactId>common-core</artifactId>
  31. <version>1.0</version>
  32. </dependency>
  33. <!-- mysql -->
  34. <dependency>
  35. <groupId>mysql</groupId>
  36. <artifactId>mysql-connector-java</artifactId>
  37. <scope>runtime</scope>
  38. </dependency>
  39. <!-- mybatis -->
  40. <dependency>
  41. <groupId>org.mybatis.spring.boot</groupId>
  42. <artifactId>mybatis-spring-boot-starter</artifactId>
  43. <version>2.1.3</version>
  44. </dependency>
  45. <!-- 必须包含spring-boot-starter-actuator包,不然启动会报错。 -->
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-actuator</artifactId>
  49. </dependency>
  50. <!-- web 应用 -->
  51. <dependency>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-starter-web</artifactId>
  54. </dependency>
  55. <!-- 配置中心所需jar包 -->
  56. <dependency>
  57. <groupId>org.springframework.cloud</groupId>
  58. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  59. </dependency>
  60. <!-- 整合的dubbo -->
  61. <dependency>
  62. <groupId>org.springframework.cloud</groupId>
  63. <artifactId>spring-cloud-starter-dubbo</artifactId>
  64. </dependency>
  65. <!-- 整合的nacos -->
  66. <dependency>
  67. <groupId>org.springframework.cloud</groupId>
  68. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  69. </dependency>
  70. <!-- sentinel -->
  71. <dependency>
  72. <groupId>org.springframework.cloud</groupId>
  73. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  74. </dependency>
  75. <!-- lombok -->
  76. <dependency>
  77. <groupId>org.projectlombok</groupId>
  78. <artifactId>lombok</artifactId>
  79. <version>1.18.2</version>
  80. <optional>true</optional>
  81. </dependency>
  82. <!-- junit 测试所需的jar包 -->
  83. <dependency>
  84. <groupId>org.springframework.boot</groupId>
  85. <artifactId>spring-boot-starter-test</artifactId>
  86. <scope>test</scope>
  87. </dependency>
  88. </dependencies>
  89. <dependencyManagement>
  90. <dependencies>
  91. <dependency>
  92. <groupId>org.springframework.cloud</groupId>
  93. <artifactId>spring-cloud-dependencies</artifactId>
  94. <version>Finchley.SR1</version>
  95. <type>pom</type>
  96. <scope>import</scope>
  97. </dependency>
  98. <dependency>
  99. <groupId>org.springframework.cloud</groupId>
  100. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  101. <version>0.2.2.RELEASE</version>
  102. <type>pom</type>
  103. <scope>import</scope>
  104. </dependency>
  105. </dependencies>
  106. </dependencyManagement>
  107. <build>
  108. <plugins>
  109. <plugin>
  110. <groupId>org.springframework.boot</groupId>
  111. <artifactId>spring-boot-maven-plugin</artifactId>
  112. </plugin>
  113. </plugins>
  114. </build>
  115. </project>

application.properties配置

  1. spring.application.name=admin-user-biz
  2. server.port=8001
  3. # sentinel dashboard
  4. spring.cloud.sentinel.transport.dashboard=10.10.10.244:8888
  5. #nacos 注册中心
  6. spring.cloud.nacos.discovery.server-addr=localhost:8848
  7. spring.cloud.nacos.discovery.namespace=dddf9ef6-638a-42fa-9b82-9c61a944f6cc
  8. #spring.cloud.nacos.discovery.cluster‐name=DEFAULT_GROUP
  9. # dubbo 服务
  10. dubbo.scan.base-packages=com.jingshang.adminuserbiz.service
  11. dubbo.protocol.name=dubbo
  12. dubbo.protocol.port=20881
  13. dubbo.registry.address=spring-cloud://localhost
  14. #订阅 (意思是调用哪个web服务的接口)
  15. #dubbo.cloud.subscribed-services=admin-user-biz
  16. #mysql日志
  17. logging.level.com.jingshang.adminuserbiz.dao=debug

注:mysql配置到了nacos中,application.properties中就不再重复写mysql的连接了,如何将mysql配置到nacos中请继续往下看

说明:application.properties中配置了nacos注册中心、sentinel流量防卫兵等基本配置、rpc远程调用协议【dubbo】

重点:当你配置了dubbo之后,Service层的注解要使用 dubbo的@Service注解,当你非要使用 @org.springframework.stereotype.Service的 @Service注解时,请一定保证当前服务没有被其他服务远程调用。否则调用此服务的服务消费者启动时将会抛出【No provider available for the service 】 翻译过来就是:没有提供该服务的提供商

2.1、构建nacos配置中心

①登录:默认账号密码都是 nacos。地址:http://localhost:8848/nacos

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 2

②进去后选择:【服务管理】—>【命名空间】—>【点击右上角:新建命名空间】

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 3

效果图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 4

④新增配置信息:选择列表页的 【配置管理】—>【选择上方刚创建的dev命名空间】—>【点击右上方的 + 号】Id、group、配置内容为必填信息。 配合格式我springboot项目中用的是properties,所以这里选properties就可以了,主要是和代码的配置文件后缀保持一致即可

我这里只配了 数据库,各位小伙伴根据自己实际情况做配置

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 5

⑤bootstrap.properties拉取配置中心信息的配置

  1. #配置中心
  2. spring.cloud.nacos.config.server-addr=localhost:8848
  3. spring.cloud.nacos.config.prefix=alibaba-admin-database
  4. spring.cloud.nacos.config.group=DEFAULT_DATABASE
  5. spring.cloud.nacos.config.file-extension=properties
  6. spring.cloud.nacos.config.namespace=dddf9ef6-638a-42fa-9b82-9c61a944f6cc
  7. # 修改nacos日志打印级别,不修改的话,配置信息一直刷新
  8. logging.level.com.alibaba.nacos:warn

yaml格式

  1. logging:
  2. level:
  3. com:
  4. alibaba:
  5. nacos: warn
  6. spring:
  7. cloud:
  8. nacos:
  9. config:
  10. file-extension: properties
  11. group: DEFAULT_DATABASE
  12. namespace: dddf9ef6-638a-42fa-9b82-9c61a944f6cc
  13. prefix: alibaba-admin-database
  14. server-addr: localhost:8848

bootstrap.properties的属性与nacos的对应关系

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 6

说明:为什么这里要创建两个配置文件,为什么不直接在application.properties中配置所有所需信息呢。这是因为nacos做配置中心的时候,默认支持的是bootstrap,而不是application,不这么做的话, 你的配置就算写的再好,也不会将其放到nacos中做配置中心的,而且会导致启动找不到配置而报错

重点:bootstrap.properties通过namespace【namespace的指向是命名空间,如果不写的话,默认去找public命名空间,但是这样的话,配置就找不到了(我们在配置中心配置的数据库信息)】和prefix【prefix它指定的配置的Id】,通过这两个属性,使得配置文件 能精准的找到属于我们自己的配置信息

⑥nacos多配制

前提:需要有一个默认配置,该默认配置需要指定【命名空间:namespace、nacos地址:server-addr】

多配制:当你需要从nacos配置中心拉取多个配置时,应该在bootstrap.properties配置文件中配置【data-id、group】如下图圈红的位置

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 7

⑦ 如需多配制请在bootstrap.properties中这么写:

  1. spring.cloud.nacos.config.ext-config[0].data-id=alibaba-admin-database.properties
  2. spring.cloud.nacos.config.ext-config[0].group=DEFAULT_DATABASE

yaml格式

  1. spring:
  2. cloud:
  3. nacos:
  4. config:
  5. ext-config:
  6. - data-id: alibaba-admin-database.properties
  7. group: DEFAULT_DATABASE

重点:值得注意的是data-id 一定要加扩展名,当你不加它的时候,系统还是会提醒你,让你选择一个合适的扩展名,至于为什么系统会这么贴心的告诉你呢? 那是因为它报错给我们了 【 报错信息:must contains file extension with properties|yaml|yml 】

误区:ext-config[0]我当时在想为什么是【0】,如果没有【0】的情况下,我可不可以直接写【1】百思不得其解,但是当我看到源码的时候我才突然恍然大悟

  1. /**
  2. * 一组扩展配置
  3. */
  4. private List<Config> extConfig;

这个配置的容器是List,而List索引必须从0开始,所以当你需要多配制的时候,要从0开始,然后才是1、2、3

配置好后启动查看控制台日志输出,如下图:加载了两个配置

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 8

⑧启动类添加注解

  1. @MapperScan(basePackages = {"com.jingshang.adminuserbiz.dao"})
  2. @EnableDiscoveryClient//将服务注册到注册中心
  3. @SpringBootApplication
  4. public class AdminUserBizApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(AdminUserBizApplication.class, args);
  7. }
  8. }

2.1:编写http接口、并进行流控及降级

①Mapper层省略、写sql语句的时候,启动类记得扫描哟或者在Mapper层加注解

②Service层:接口写在 admin-user-api 里面,如下图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 9

接口方法:String findByName(Integer id); id查询返回名称,这方法名起的不咋地,能懂意思就行哈,不要太在意我起的名字​​​​​​​

③Service实现类:该实现类放在 admin-user-biz 里面。如下图。如果不明白api、zip的区别,请往上看,上面有说明。​​​​​​​

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 10

④接口方法:

  1. @Slf4j
  2. @Service
  3. public class UserServiceImpl implements UserDubboService {
  4. @Resource
  5. private UserDao sysUserDao;
  6. @SentinelResource(value = "user/findByName", blockHandler = "exceptionHandler")
  7. @Override
  8. public String findByName(Integer id) {
  9. return sysUserDao.findByName(id);
  10. }
  11. }

重点:

1、@Service注解使用 dubbo的注解,且一定要实现接口

2、@SentinelResource它是sentinel的注解(用于服务限流、降级、服务熔断)

用于定义资源,并提供可选的异常处理和 fallback 配置项。

@SentinelResource 注解包含以下属性:

value:资源名称,必需项(不能为空)

entryType:entry 类型,可选项(默认为EntryType.OUT)

blockHandler(命名块的异常功能) 、 blockHandlerClass (指定自定义限流及降级的类)

3、Sentinel限流、降级的使用

一:流控

①先请求接口,因为只有请求完接口后,sentinel的簇点链路才有该路径,才可以进行限流​​​​​​​

20201014145354332.png

②打开sentinel 簇点链路->列表视图->找到刚调用的接口地址->点击流控​​​​​​​

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 11

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 12

QPS:点击数

单机阈值:单位时间内QPS和线程数的数量

线程数:跟QPS很像,理解直观意思即可

关联:比如A接口地址为资源名、B接口地址为关联的资源名,当A接口限流后,B接口也会被限流

Warm Up:预热模式,该加载因子默认是3,意思是当QPS(点击数)设置每秒10次,warm up设置5秒,那就是在5秒内处于预热模式。每秒的并发是 QPS/加载因子、10/3 ,也就是说在预热模式内(warm up = 5秒)并发最多是3,当大于3的时候就会进行流量控制

排队等候:这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态, 我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

注意:匀速排队模式暂时不支持 QPS > 1000 的场景。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 13

注意 :自定义的流量控制异常请参考上面接口实现类里的方法

二:降级

①先请求接口,因为只有请求完接口后,sentinel的簇点链路才有该路径,才可以进行降级

20201014145648200.png

②打开sentinel 簇点链路->列表视图->找到刚调用的接口地址->点击降级

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 14

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 15

注意:降级规则1.8之后更新了策略

RT:平均响应时间,当rt设置为200毫秒时则表示,单位时间内的的请求平均响应时间必须在200毫秒以内完成,若超出则会触发降级

时间窗口:被降级后的资源将在时间窗口后恢复正常

异常比例:单位时间内的请求,当报错达到一定比例后服务将会自动降级(例:每秒请求10次,异常比例设置为20%,那么10次请求中报错超过3次,报错就会 超过20%,一旦超过,sentinel就会进行服务熔断)

异常数:这个相对于前两个就比较好理解一些了,直接设置好报错的次数,当报错次数超过设置的异常数时,就会自动降级

注意 :自定义的服务降级异常请参考上面接口实现类里的方法,与流控的自定义异常写法可以保持一致,关键点在sentinel Dashbord对于该资源是设置了限流还是降级

2.2 服务消费者

服务消费者

1、创建 admin-role-api 模块:右键alibaba-module->new->module->创建maven项目

构建Pom:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <artifactId>alibaba-module</artifactId>
  8. <groupId>com.jingshang</groupId>
  9. <version>1.0</version>
  10. </parent>
  11. <artifactId>admin-role-api</artifactId>
  12. <packaging>jar</packaging>
  13. <description>role模块</description>
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. </project>

2、创建 admin-role-biz 模块:右键alibaba-module->new->module->创建springboot项目

构建Pom:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.jingshang</groupId>
  6. <artifactId>admin-role-biz</artifactId>
  7. <version>1.0</version>
  8. <packaging>jar</packaging>
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>2.0.5.RELEASE</version>
  13. <relativePath/> <!-- lookup parent from repository -->
  14. </parent>
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  17. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  18. <java.version>1.8</java.version>
  19. </properties>
  20. <dependencies>
  21. <!-- 引入Api -->
  22. <dependency>
  23. <groupId>com.jingshang</groupId>
  24. <artifactId>admin-role-api</artifactId>
  25. <version>1.0</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.jingshang</groupId>
  29. <artifactId>admin-user-api</artifactId>
  30. <version>1.0</version>
  31. </dependency>
  32. <!-- mysql -->
  33. <dependency>
  34. <groupId>mysql</groupId>
  35. <artifactId>mysql-connector-java</artifactId>
  36. <scope>runtime</scope>
  37. </dependency>
  38. <!-- mybatis -->
  39. <dependency>
  40. <groupId>org.mybatis.spring.boot</groupId>
  41. <artifactId>mybatis-spring-boot-starter</artifactId>
  42. <version>2.1.3</version>
  43. </dependency>
  44. <!-- 必须包含spring-boot-starter-actuator包,不然启动会报错。 -->
  45. <dependency>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-starter-actuator</artifactId>
  48. </dependency>
  49. <!-- web 应用 -->
  50. <dependency>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-starter-web</artifactId>
  53. </dependency>
  54. <!-- 整合的dubbo -->
  55. <dependency>
  56. <groupId>org.springframework.cloud</groupId>
  57. <artifactId>spring-cloud-starter-dubbo</artifactId>
  58. </dependency>
  59. <!-- 整合的nacos -->
  60. <dependency>
  61. <groupId>org.springframework.cloud</groupId>
  62. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  63. </dependency>
  64. <!-- 配置中心所需jar包 -->
  65. <dependency>
  66. <groupId>org.springframework.cloud</groupId>
  67. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  68. </dependency>
  69. <!-- sentinel -->
  70. <dependency>
  71. <groupId>org.springframework.cloud</groupId>
  72. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  73. </dependency>
  74. <dependency>
  75. <groupId>org.projectlombok</groupId>
  76. <artifactId>lombok</artifactId>
  77. <version>1.18.2</version>
  78. <optional>true</optional>
  79. </dependency>
  80. <!-- junit 测试所需的jar包 -->
  81. <dependency>
  82. <groupId>org.springframework.boot</groupId>
  83. <artifactId>spring-boot-starter-test</artifactId>
  84. <scope>test</scope>
  85. </dependency>
  86. </dependencies>
  87. <dependencyManagement>
  88. <dependencies>
  89. <dependency>
  90. <groupId>org.springframework.cloud</groupId>
  91. <artifactId>spring-cloud-dependencies</artifactId>
  92. <version>Finchley.SR1</version>
  93. <type>pom</type>
  94. <scope>import</scope>
  95. </dependency>
  96. <dependency>
  97. <groupId>org.springframework.cloud</groupId>
  98. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  99. <version>0.2.2.RELEASE</version>
  100. <type>pom</type>
  101. <scope>import</scope>
  102. </dependency>
  103. </dependencies>
  104. </dependencyManagement>
  105. <build>
  106. <plugins>
  107. <plugin>
  108. <groupId>org.springframework.boot</groupId>
  109. <artifactId>spring-boot-maven-plugin</artifactId>
  110. </plugin>
  111. </plugins>
  112. </build>
  113. </project>

application.properties基本配置

  1. spring.application.name=admin-role-biz
  2. server.port=8002
  3. # sentinel dashboard (限流、熔断降级)
  4. spring.cloud.sentinel.transport.dashboard=10.10.10.244:8888
  5. #nacos 注册中心
  6. spring.cloud.nacos.discovery.server-addr=localhost:8848
  7. spring.cloud.nacos.discovery.namespace=dddf9ef6-638a-42fa-9b82-9c61a944f6cc
  8. # dubbo 服务
  9. #dubbo.scan.base-packages=com.jingshang.adminrolebiz.service
  10. dubbo.protocol.name=dubbo
  11. dubbo.protocol.port=20882
  12. dubbo.registry.address=spring-cloud://localhost
  13. #订阅 (意思是调用哪个web服务的接口)
  14. dubbo.cloud.subscribed-services=admin-user-biz
  15. #mysql日志
  16. logging.level.com.jingshang.adminrolebiz.dao=debug

bootstrap.properties拉取配置中心的配置,这里跟服务提供者保持一致,都是拉取的同一个数据库的配置,这里就不重新粘贴代码了,小伙伴可直接复制服务提供者的bootstrap.properties中的配置,我这里只在nacos中配置了数据库,其他配置根据小伙伴们的个人需求进行编写

启动类添加@EnableDiscoveryClient注解

注:搭建消费者的方法与提供者步骤相同,这里不再赘述​​​​​​​

3、消费提供者提供的方法​​​​​​​

serviceImpl

  1. package com.jingshang.adminrolebiz.service;
  2. import com.jingshang.adminuserapi.dubbo.UserDubboService;
  3. import org.apache.dubbo.config.annotation.Reference;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * @Author: 王文龙
  7. * @Date: 2020/9/914:21
  8. * @Version: 1.0
  9. * @Describe: 描述:
  10. */
  11. @Component
  12. public class RoleServiceImpl {
  13. @Reference
  14. UserDubboService dubboService;//dubbo服务
  15. public String findByName(Integer id) {
  16. return dubboService.findByName(id);
  17. }
  18. }

注入服务提供者时,要使用dubbo的@Reference注解,我个人远程调用是用的dubbo的rpc协议,如果远程调用使用的的feign的话就另当别论了

注:因为我这里没有实现接口,所以不需要@Service注解,但需要 @Component注解,而且application.properties也不可以让dubbo去扫描service包,在你妹使用dubbo的@Service注解的时候,配置里去扫描service包是会报错的,所以这里注意一下

controller

  1. package com.jingshang.adminrolebiz.controller;
  2. import com.jingshang.adminrolebiz.service.RoleServiceImpl;
  3. import com.jingshang.adminuserapi.dubbo.UserDubboService;
  4. import org.apache.dubbo.config.annotation.Reference;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import javax.annotation.Resource;
  8. /**
  9. * @Author: 王文龙
  10. * @Date: 2020/9/914:25
  11. * @Version: 1.0
  12. * @Describe: 描述:
  13. */
  14. @RestController
  15. @RequestMapping("/role")
  16. public class RoleController {
  17. @Resource
  18. private RoleServiceImpl roleService;
  19. @RequestMapping("/findByName")
  20. public String findByName(Integer id) {
  21. return roleService.findByName(id);
  22. }
  23. }

5、PostMan调用接口

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjI3Mjgx_size_16_color_FFFFFF_t_70 16

!!!! 关于服务注册、订阅、配置、限流、降级就到此结束了​​​​​​​

发表评论

表情:
评论列表 (有 0 条评论,405人围观)

还没有评论,来说两句吧...

相关阅读