微服务项目的搭建
简述一下:
会使用到 nacos openfegin sentinel
三个微服务模块 一个基础服务模块 注意:文中所有的依赖都是引入到基础服务模块 base中
三个微服务模块继承与基础服务模块 可以做到依赖共享
- service-base 基础服务模块
- service-core 主服务模块
- service-oss 文件存储服务模块
- service-sms 短信服务模块
1 nacos的配置
1、Nacos下载和安装
下载地址:https://github.com/alibaba/nacos/releases
2、Windows启动Nacos
参考:https://github.com/alibaba/nacos
解压:将下载的压缩包解压
启动:startup.cmd -m standalone
3、访问
用户名密码:nacos/nacos
4、引入依赖
<!--服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
5、添加服务配置信息
在需要注册到注册中心的微服务放入配置文件中添加配置
#spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
6、启动微服务
启动已注册的微服务,查看 “服务管理 => 服务列表”,可就以看到已注册的微服务
2 OpenFeign的引入
1、引入依赖
service-base模块中配置OpenFeign的依赖(实际是在服务消费者端需要OpenFeign的依赖)
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、启动类添加注解
在service-sms的启动类添加如下注解
因为service-sms是消费者 需要开启feign的远程调用
@EnableFeignClients
我们这里以注册业务为例 在发送注册验证码的时候 我们需要判断用户有没有注册过 所以需要在短信模块中远程调用接口 判断用户是否注册过 判断用户是否注册过的接口处在另一模块中
-
服务提供者接口信息
需要在消费者端创建一个接口 学过的都懂
-
服务消费者 也就是短信服务
需要向那个服务发送远程调用
@FeignClient(value = "service-core")// nacos中远程调用的名称 public interface CoreUserInfoClient { // 远程调用的完整路径 参数跟提供者一致 @GetMapping("/api/core/userInfo/checkMobile/{mobile}") boolean checkMobile(@PathVariable String mobile); }
这样也大概实现的远程调用 但是有没有可能会发生这种情况
-
远程调用超时了呢 解决办法: 配置更大的超时时间
默认openFeign的超时时间只有1秒钟
-
可以在配置文件中添加如下配置:是消费端配置哦
feign: client: config: default: connectTimeout: 10000 #连接超时配置 readTimeout: 600000 #执行超时配置
-
远程调用出错了呢
配置容错措施 用sentinel实现 后面会说
-
3、日志
不知道你们会不会有这样的疑问 我们怎么知道远程调用是否成功了呢 不能只看报错信息吧 openFeign也提供了日志功能 下面看看吧
1、作用
OpenFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。
2、日志级别
- NONE:默认级别,不显示日志
- BASIC:仅记录请求方法、URL、响应状态及执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应头信息
- FULL:除了HEADERS中定义的信息之外,还有请求和响应正文及元数据信息
3、配置日志bean
在service-base中创建配置文件 也就是基础服务模块
@Configuration
public class OpenFeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
4、开启日志
sms的application.yml中指定监控的接口,以及日志级别
CoreUserInfoClient 发送远程调用的接口
logging:
level:
com.atguigu.srb.sms.client.CoreUserInfoClient: DEBUG #以什么级别监控哪个接口
5、监控到的日志
HTTP 是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。
如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输数据。
HTTP 有一个 KeepAlive 模式,它告诉 webserver 在处理完一个请求后保持这个 TCP 连接的打开状态。
若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。
timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。
3 sentinel 服务容错
在服务发送错误时 消费端的一种容错模式
1、引入依赖
service-base中引入sentinel依赖
<!--服务容错-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、开启Sentinel支持
在service-sms的yml配置文件中开启Feign对Sentinel的支持
#开启Feign对Sentinel的支持
#feign:
sentinel:
enabled: true
3、创建容错类
fallback:当无法校验手机号是否已注册时,直接发送短信
package com.atguigu.sms.client.fallback;
import com.atguigu.sms.client.CoreUserInfoClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 对远程服务调用的容错措施
* @author : look-word
* @date : 2022-05-22 19:14
**/
@Slf4j
@Service
public class CoreUserInfoClientFallBack implements CoreUserInfoClient {
@Override
public boolean checkMobile(String mobile) {
log.info("远程调用失败 除法服务熔断 service-core/api/core/userInfo/checkMobile/"+mobile);
return false;
}
}
4、指定熔断类
为OpenFeign远程调用接口添加fallback属性值没指定容错类
CoreUserInfoClient 远程调用接口哦
@FeignClient(value = "service-core", fallback = CoreUserInfoClientFallback.class)
public interface CoreUserInfoClient {
5、测试
停止core微服务测试
我们可以看到 服务容错生效