一、开发工具与基础配置
1.创建 Maven 模块
创建新的 Maven 模块时,archetype 一般选择maven-archetype-quickstart
就可以了。
2.日志简化
@Slf4j
是 Lombok 提供的一个注解,用于简化日志记录的代码。
3.IDEA快速复制服务:
- Services -> 右键服务选择 "Copy Configuration"
- Modify options -> "verride configuration properties"
- 添加 "server.port" 新端口号
二、Spring Boot 远程服务调用
Spring Boot 中的 RestTemplate 用于远程服务调用:
-
在启动器类中添加:
typescript@Bean public RestTemplate restTemplate() { return new RestTemplate(); }
-
使用 RestTemplate 只需要使用
@Autowired
注解即可:java@Autowired private RestTemplate restTemplate;
三、Eureka 服务注册与发现
1.搭建 Eureka Server
搭建 Eureka Server 的过程:
markdown
1. 引入 eureka-server 依赖
2. 在启动器上添加 `@EnableEurekaServer` 注解
3. 在 `application.yml` 中配置 Eureka 地址
2.服务注册
将服务注册到 Eureka Server 中:
markdown
1. 引入 eureka-client 依赖
2. 在 `application.yml` 中配置 Eureka 地址
3.服务拉取与负载均衡
在服务消费者order-service
中进行服务拉取并进行负载均衡:
markdown
1. 修改 `OrderService` 中 RestTemplate 远程服务调用的代码,用服务名代替 IP 和端口
2. 在 `order-service` 的启动类 `OrderApplication` 中的 RestTemplate 添加 `@LoadBalanced` 注解
四、Ribbon 负载均衡
1.修改负载均衡策略
IRule
决定了负载均衡的策略,可以通过以下两种方式修改:
-
代码方式(适用于所有服务):
java@Bean public IRule randomRule() { return new RandomRule(); }
-
配置文件方式 (针对特定服务,如
userservice
):yamluserservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
2. Ribbon 配置
Ribbon 默认采用懒加载(第一次访问时才创建 LoadBalanceClient
,请求时间较长)。可以通过以下配置开启饥饿加载:
yaml
ribbon:
eager-load:
enabled: true
clients:
- userservice
- xxxxservice
五、Feign 客户端
1.Feign 功能
Feign 是一个优雅的远程服务调用工具,集成负载均衡功能:
1.导入 Feign 依赖:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.启动类中添加@EnableFeignClients
注解
3.声明接口:
java
@FeignClient("user-service")
public interface UserClient {
@GetMapping("/user/{id}")
User queryUserById(@PathVariable("id") Long id);
}
4.使用 Feign 代替 RestTemplate 进行远程调用
2. Feign 自定义配置
Feign 的自定义配置(以日志配置为例):
1.配置文件方式:
yaml
feign.client.config.xxx.loggerLevel: BASIC
- 如果xxx
是default
,则为全局配置。
- 如果xxx
是服务名称(如userservice
),则为特定服务配置。
2. Java 代码方式:
java
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
- 在@EnableFeignClients
注解中声明为全局配置。
- 在@FeignClient
注解中声明为特定服务配置。
3. Feign 性能优化
优化 Feign 性能:
- 使用连接池代替默认的
URLConnection
连接,日志级别建议使用Basic
或none
。 - 引入
httpClient
依赖:
xml
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
- 配置文件:
yaml
feign:
client:
config:
default:
loggerLevel: BASIC
httpclient:
enabled: true
max-connections: 20
max-connections-per-route: 50
4. Feign 最佳实践
Feign 的最佳实践有两种方式:
- 继承方式:服务端的 Controller 和客户端的 FeignClient 继承同一接口(契约思想)。
- 抽取方式:将 FeignClient、PoJo、Feign 的默认配置定义到一个项目中,消费者只需导入依赖即可(解耦合)。
5.实现抽取方式
实现 Feign 的抽取方式:
-
创建一个新的模块,命名为
feign-api
,导入 Feign 的 starter 依赖。 -
将
order-server
中的UserClient
、User
、配置文件复制到feign-api
中。 -
在
order-service
中引入feign-api
的依赖。 -
修改
order-service
中的 import 路径,改为导入feign-api
中的包。 -
在启动器上添加注解,扫描
feign-api
中的 Bean:python@EnableFeignClients(clients = {UserClient.class})
或
ini
@EnableFeignClients(basePackages = {"cn.itcast.feign.clients"})
六、Nacos 配置管理
1. 配置管理
Nacos 的配置管理:
- 在 Nacos 中添加需要热更新的配置文件(
[服务名称]-[profile].yaml
)。 - 获取 Nacos 的依赖:
-
引入 Nacos 配置管理客户端依赖(在父工程中配置版本)。
-
在
resources
文件夹中新建bootstrap.yml
文件,配置 Nacos 的基本信息:yamlspring: application: name: user-service profiles: active: dev cloud: nacos: server-addr: localhost:8848 config: file-extension: yaml
-
2.热更新实现
实现 Nacos 配置热更新:
方式一:在使用 @Value
注解读取配置的类上添加 @RefreshScope
注解:
java
@Value("${pattern.dataformat}")
private String dataformat;
方式二:使用@ConfigurationProperties
注解,将配置注入到标记类的字段中,其他类直接调用该类。
3. 配置优先级
微服务会从 Nacos 读取的配置文件:
[服务名]-[spring.profile.active].yaml
(环境配置)[服务名].yaml
(共享环境配置) 配置优先级:[服务名]-[环境].yaml
>[服务名].yaml
> 本地配置
4.企业生产中,为了高可用性,则会进行 nacos 集群搭建
七、Sring Cloud Gateway
1.统一网关的作用
- 统一路径,并对用户请求做身份验证、权限校验。
- 将用户请求路由到微服务,并实现负载均衡
- 对用户请求做限流操作。
2.路由断言工厂 Route Predicate Factory
作用:读取用户定义的断言条件,对请求进行判断。
示例:
path=/user/**
: 表示以 /user/ 开头的路径满足条件(路由过滤器)
3.过滤器工厂 Filter
-
对路由的请求或响应做加工处理,比如添加请求头。
-
配置在路由下的过滤器只对当前路由的请求有效。
-
default-filters:对所有路由都生效的过滤器。
4.全局配置过滤器 GlobalFilter
作用:对所有的路由都生效的过滤器,并且可以自定义处理逻辑。
实现步骤:
-
实现
GlobalFilter
接口。 -
添加
@Order()
注解或实现Ordered
接口(通过@Component
注入容器)。 -
编写处理逻辑。
5.过滤器的执行顺序
-
order
值越小,优先级越高。 -
当
order
值相同: -
顺序是
defaultFilter
最先,然后是局部的路由过滤器,最后是全局过滤器。
6.Gateway 解决 AJAX 请求跨域问题:CORS 方式
yaml
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决 OPTIONS 请求
corsConfigurations:
'[/**]':
allowed-origins: # 允许哪些网站的跨域请求
- "http://127.0.0.1:5500" # 请确保链接的合法性
allowed-methods: # 允许的跨域 AJAX 的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带 cookie
maxAge: 360000 # 这次跨域检测的有效期