Nacos
准备
添加服务配置信息
core
、sms
、oss
模块的application.yml
#spring: 在spring节点下
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
nacos添加依赖
service-base
的pom
<!--nacos-服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动nacos服务
startup.cmd -m standalone
OpenFeign
service-base
pom
<!--openfeign-服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
service-core
服务提供者
service
UserInfoService.java
boolean checkMobile(String mobile);
UserInfoServiceImpl.java
@Override
public boolean checkMobile(String mobile) {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mobile", mobile);
Integer count = baseMapper.selectCount(queryWrapper);
return count > 0;
}
contoller
UserInfoController.java
@ApiOperation("检查手机号是否已注册")
@GetMapping("/checkMobile/{mobile}")
public boolean checkMobile(@PathVariable String mobile){
return userInfoService.checkMobile(mobile);
}
service-sms
服务消费者
main
ServiceSmsApplication,java
@EnableFeignClients
public class ServiceSmsApplication {
client
根目录下创建client
包
CoreUserInfoClient.java
package com.indi.srb.sms.client;
@FeignClient(value = "service-core")
public interface CoreUserInfoClient {
@GetMapping("/api/core/userInfo/checkMobile/{mobile}")
boolean checkMobile(@PathVariable String mobile);
}
controller
ApiSmsController.java
@Resource
private CoreUserInfoClient coreUserInfoClient;
// 手机号是否已注册过
Assert.isTrue(!coreUserInfoClient.checkMobile(mobile), ResponseEnum.MOBILE_EXIST_ERROR);
超时控制
openfeign默认的连接超时时间为1秒,测试时很可能会出现远程调用超时错误。
可以在配置文件中添加如下配置:
feign:
client:
config:
default:
connectTimeout: 10000 #连接超时配置
readTimeout: 600000 #执行超时配置
OpenFeign日志
1、作用
OpenFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。
2、日志级别
- NONE:默认级别,不显示日志
- BASIC:仅记录请求方法、URL、响应状态及执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应头信息
- FULL:除了HEADERS中定义的信息之外,还有请求和响应正文及元数据信息
3、配置日志bean
service-base
的config
包下
OpenFeignConfig.java
package com.indi.srb.base.config;
@Configuration
public class OpenFeignConfig {
@Bean
Level feignLoggerLevel(){
return Level.FULL;
}
}
4、开启日志
service-sms
模块
application.yml
logging:
level:
com.atguigu.srb.sms.client.CoreUserInfoClient: DEBUG #以什么级别监控哪个接口
5、修改logback日志级别
service-sms
模块
logback-spring.xml
修改日志的level为DEBUG
6、查看日志输出
测试发送验证码
补充:
HTTP 是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。
如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输数据。
HTTP 有一个 KeepAlive 模式,它告诉 webserver 在处理完一个请求后保持这个 TCP 连接的打开状态。
若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。
timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。
Sentinel
需求
sms调用core期间,一旦core长时间没有响应或者宕机,会直接影响到sms,我们不应该让core影响sms,所以需要为sms设置服务熔断和降级。
service-base
pom
<!--sentinel-服务容错-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
service-sms
client
CoreUserInfoClient.java
fallback
client
下创建fallback
包
package com.indi.srb.sms.client.fallback;
@Service
@Slf4j
public class CoreUserInfoClientFallback implements CoreUserInfoClient {
@Override
public boolean checkMobile(String mobile) {
log.error("远程调用失败,服务熔断");
return false;
}
}
测试
停止core微服务测试
使用sentinel之后可以发现,点击获取验证码时,即使core宕机,sms也会正常发送验证码,至于校验该手机号是否注册过,会留到点击下一步的时候,在那里core会校验。