程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

尚融宝21-整合springcloud

发布于2023-05-20 21:20     阅读(717)     评论(0)     点赞(10)     收藏(4)


目录 

一、整合注册中心nacos

二、整合openFeign

(一)准备工作

(二)导入依赖 

(三)接口的远程调用

(四)配置超时控制和日志打印

三、整合Sentinel

四、整合gateway服务网关


一、整合注册中心nacos

使用nacos1.4.1,下载地址:Releases · alibaba/nacos · GitHub

详细可以看这篇文章:SpringCloud AlibabaNacos服务注册和配置中心 

进入nacos目录下的bin目录,通过cmd窗口输入startup.cmd -m standalone启动nacos

通过8848端口访问nacos,账号密码都为nacos

http://localhost:8848/nacos/

在service-base模块中配置Nacos客户端依赖

  1. <!--服务发现-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

给每一个微服务配置nacos发现的配置

  1. #spring:
  2. cloud:
  3. nacos:
  4. discovery:
  5. server-addr: localhost:8848 # nacos服务地址

 可以看到三个服务都注册进来了

二、整合openFeign

在用户注册时,原本我们的流程是用户填写信息,获取验证码,点击登录后再判断是否注册过,这样子即浪费用户时间又浪费短信次数,应该在点击获取验证码的时候就对手机号进行判断,即在service-ssm获取验证码的方法中调用service-core的userInfo对象查询数据库是否该手机已经有注册用户。像这样一个微服务调用另外一个微服务的情况,我们就可以整合openFeign进行服务接口的调用

(一)准备工作

首先在userInfoController中添加校验手机号是否注册的方法

  1. @ApiOperation("校验手机号是否注册")
  2. @GetMapping("/checkMobile/{mobile}")
  3. public boolean checkMobile(@PathVariable String mobile){
  4. return userInfoService.checkMobile(mobile);
  5. }

userService

boolean checkMobile(String mobile);

 userServiceImpl

  1. @Override
  2. public boolean checkMobile(String mobile) {
  3. QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
  4. queryWrapper.eq("mobile", mobile);
  5. Integer count = baseMapper.selectCount(queryWrapper);
  6. return count > 0;
  7. }

(二)导入依赖 

引入openFeign,在service-base的pom.xml中导入依赖

  1. <!--服务调用-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

 在service-sms启动类上添加注解@EnableFeignClients

(三)接口的远程调用

service-sms中添加远程调用的client接口,调用生产者的方法

  1. @FeignClient(value = "service-core")
  2. public interface CoreUserInfoClient {
  3. // 注意这里的路径要写全
  4. @GetMapping("/api/core/userInfo/checkMobile/{mobile}")
  5. boolean checkMobile(@PathVariable String mobile);
  6. }

在ApiSmsController引入client

  1. @Resource
  2. private CoreUserInfoClient coreUserInfoClient;

在获取验证码方法中调用远程方法校验手机号是否存在

  1. //手机号是否注册
  2. boolean result = coreUserInfoClient.checkMobile(mobile);
  3. System.out.println("result = " + result);
  4. Assert.isTrue(result == false, ResponseEnum.MOBILE_EXIST_ERROR);
  5. //生成验证码
  6. .....

(四)配置超时控制和日志打印

openfeign默认的连接超时时间为1秒,测试时很可能会出现远程调用超时错误。

可以在配置文件中添加如下配置:

  1. feign:
  2. client:
  3. config:
  4. default:
  5. connectTimeout: 10000 #连接超时配置
  6. readTimeout: 600000 #执行超时配置

OpenFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。

日志级别

  • NONE:默认级别,不显示日志
  • BASIC:仅记录请求方法、URL、响应状态及执行时间
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应头信息
  • FULL:除了HEADERS中定义的信息之外,还有请求和响应正文及元数据信息

配置日志bean

在service-base中创建配置文件

  1. @Configuration
  2. public class OpenFeignConfig {
  3. @Bean
  4. Logger.Level feignLoggerLevel(){
  5. return Logger.Level.FULL;
  6. }
  7. }

开启日志

 sms的application.yml中指定监控的接口,以及日志级别

  1. logging:
  2. level:
  3. com.atguigu.srb.sms.client.CoreUserInfoClient: DEBUG #以什么级别监控哪个接口

修改logback日志级别

 修改日志的level为DEBUG

  1. <!-- 开发环境和测试环境 -->
  2. <springProfile name="dev,test">
  3. <logger name="com.atguigu" level="DEBUG">
  4. <appender-ref ref="CONSOLE" />
  5. </logger>
  6. </springProfile>

查看日志输出

HTTP 是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。

如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输数据。

HTTP 有一个 KeepAlive 模式,它告诉 webserver 在处理完一个请求后保持这个 TCP 连接的打开状态。

若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。

KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。

timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。

三、整合Sentinel

当sms服务调用core服务,如果core服务出现问题无法响应,此时会造成sms的忙等,如果有别的服务也在这条链路上,那么整条链路都会崩坏。所以我们需要对调用做兜底

service-base引入sentinel的依赖

  1. <!--服务容错-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  5. </dependency>

在service-sms的yml配置文件中开启Feign对Sentinel的支持

  1. #开启Feign对Sentinel的支持
  2. #feign:
  3. sentinel:
  4. enabled: true

创建容错类,即兜底方案,fallback:当无法校验手机号是否已注册时,直接发送短信

  1. @Service
  2. @Slf4j
  3. public class CoreUserInfoClientRollback implements CoreUserInfoClient {
  4. /*
  5. * 当接口中的原本的服务出现问题没法响应时,调用当前方法,即为服务降级
  6. * 也相当于一种兜底方案,需要在接口上FeignClient的fallback注册
  7. */
  8. @Override
  9. public boolean checkMobile(String mobile) {
  10. return false;
  11. }
  12. }

为OpenFeign远程调用接口添加fallback属性值没指定容错类

  1. @FeignClient(value = "service-core", fallback = CoreUserInfoClientFallback.class)
  2. public interface CoreUserInfoClient {

此时重新启动service-sms服务并停止service-core服务,发送验证码可以发现短信发送成功,而且redis中也有验证码,说明走了兜底方案

四、整合gateway服务网关

我们使用gateway代替nginx

srb下创建普通maven模块 service-gateway

(一)添加依赖

  1. <dependencies>
  2. <!-- 网关 -->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-gateway</artifactId>
  6. </dependency>
  7. <!--服务注册-->
  8. <dependency>
  9. <groupId>com.alibaba.cloud</groupId>
  10. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  11. </dependency>
  12. </dependencies>

(二)配置application

  1. server:
  2. port: 80 # 服务端口
  3. spring:
  4. profiles:
  5. active: dev # 环境设置
  6. application:
  7. name: service-gateway # 服务名
  8. cloud:
  9. nacos:
  10. discovery:
  11. server-addr: localhost:8848 # nacos服务地址
  12. gateway:
  13. discovery:
  14. locator:
  15. enabled: true # gateway可以发现nacos中的微服务,并自动生成转发路由

(三)logback-spring.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <contextName>atguiguSrb</contextName>
  4. <!-- 日志的输出目录 -->
  5. <property name="log.path" value="D:/idealworkspace/shangrb/srb_log/gateway" />
  6. <!--控制台日志格式:彩色日志-->
  7. <!-- magenta:洋红 -->
  8. <!-- boldMagenta:粗红-->
  9. <!-- cyan:青色 -->
  10. <!-- white:白色 -->
  11. <!-- magenta:洋红 -->
  12. <property name="CONSOLE_LOG_PATTERN"
  13. value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) %green(%logger) %msg%n"/>
  14. <!--文件日志格式-->
  15. <property name="FILE_LOG_PATTERN"
  16. value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] %thread %file:%line %logger %msg%n" />
  17. <!--编码-->
  18. <property name="ENCODING"
  19. value="UTF-8" />
  20. <!-- 控制台日志 -->
  21. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  22. <encoder>
  23. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  24. <charset>${ENCODING}</charset>
  25. </encoder>
  26. </appender>
  27. <!-- 文件日志 -->
  28. <appender name="FILE" class="ch.qos.logback.core.FileAppender">
  29. <file>${log.path}/log.log</file>
  30. <append>true</append>
  31. <encoder>
  32. <pattern>${FILE_LOG_PATTERN}</pattern>
  33. <charset>${ENCODING}</charset>
  34. </encoder>
  35. </appender>
  36. <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  37. <!-- 要区别于其他的appender中的文件名字 -->
  38. <file>${log.path}/log-rolling.log</file>
  39. <encoder>
  40. <pattern>${FILE_LOG_PATTERN}</pattern>
  41. <charset>${ENCODING}</charset>
  42. </encoder>
  43. <!-- 设置滚动日志记录的滚动策略 -->
  44. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  45. <!-- 日志归档路径以及格式 -->
  46. <fileNamePattern>${log.path}/info/log-rolling-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  47. <!--归档日志文件保留的最大数量-->
  48. <maxHistory>15</maxHistory>
  49. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  50. <maxFileSize>1KB</maxFileSize>
  51. </timeBasedFileNamingAndTriggeringPolicy>
  52. </rollingPolicy>
  53. </appender>
  54. <!-- <logger name="com.atguigu" level="INFO">-->
  55. <!-- <appender-ref ref="CONSOLE" />-->
  56. <!-- <appender-ref ref="FILE" />-->
  57. <!-- </logger>-->
  58. <!-- 开发环境和测试环境 -->
  59. <springProfile name="dev,test">
  60. <logger name="com.atguigu" level="INFO">
  61. <appender-ref ref="CONSOLE" />
  62. </logger>
  63. </springProfile>
  64. <!-- 生产环境 -->
  65. <springProfile name="prod">
  66. <logger name="com.atguigu" level="ERROR">
  67. <appender-ref ref="CONSOLE" />
  68. <appender-ref ref="ROLLING_FILE" />
  69. </logger>
  70. </springProfile>
  71. </configuration>

(四)启动类

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class ServiceGatewayApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ServiceGatewayApplication.class, args);
  6. }
  7. }

(五)配置路由

  1. #spring:
  2. # cloud:
  3. # gateway:
  4. routes:
  5. - id: service-core
  6. uri: lb://service-core
  7. predicates:
  8. - Path=/*/core/**
  9. - id: service-sms
  10. uri: lb://service-sms
  11. predicates:
  12. - Path=/*/sms/**
  13. - id: service-oss
  14. uri: lb://service-oss
  15. predicates:
  16. - Path=/*/oss/**

(六)跨域配置

使用nginx的时候,对于跨域问题我们的方案是在类上加上@CrossOrigin注解,使用gateway后原本的方案就不行了,需要使用以下配置类解决

  1. package com.atguigu.srb.gateway.config;
  2. @Configuration
  3. public class CorsConfig {
  4. @Bean
  5. public CorsWebFilter corsFilter() {
  6. CorsConfiguration config = new CorsConfiguration();
  7. config.setAllowCredentials(true); //是否允许携带cookie
  8. config.addAllowedOrigin("*"); //可接受的域,是一个具体域名或者*(代表任意域名)
  9. config.addAllowedHeader("*"); //允许携带的头
  10. config.addAllowedMethod("*"); //允许访问的方式
  11. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  12. source.registerCorsConfiguration("/**", config);
  13. return new CorsWebFilter(source);
  14. }
  15. }

原文链接:https://blog.csdn.net/m0_62946761/article/details/130137577



所属网站分类: 技术文章 > 博客

作者:匿名哭哭

链接:http://www.phpheidong.com/blog/article/546077/a1c8e81e973907e74821/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

10 0
收藏该文
已收藏

评论内容:(最多支持255个字符)