core
、sms
、oss
模块的application.yml
#spring: 在spring节点下
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
service-base
的pom
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
startup.cmd -m standalone
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
服务提供者
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;
}
UserInfoController.java
@ApiOperation("检查手机号是否已注册")
@GetMapping("/checkMobile/{mobile}")
public boolean checkMobile(@PathVariable String mobile){
return userInfoService.checkMobile(mobile);
}
服务消费者
ServiceSmsApplication,java
@EnableFeignClients
public class ServiceSmsApplication {
根目录下创建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);
}
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提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。
service-base
的config
包下
OpenFeignConfig.java
package com.indi.srb.base.config;
@Configuration
public class OpenFeignConfig {
@Bean
Level feignLoggerLevel(){
return Level.FULL;
}
}
service-sms
模块
application.yml
logging:
level:
com.atguigu.srb.sms.client.CoreUserInfoClient: DEBUG #以什么级别监控哪个接口
service-sms
模块
logback-spring.xml
修改日志的level为DEBUG
测试发送验证码
补充:
HTTP 是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。
如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输数据。
HTTP 有一个 KeepAlive 模式,它告诉 webserver 在处理完一个请求后保持这个 TCP 连接的打开状态。
若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。
timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。
sms调用core期间,一旦core长时间没有响应或者宕机,会直接影响到sms,我们不应该让core影响sms,所以需要为sms设置服务熔断和降级。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
CoreUserInfoClient.java
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会校验。