《Spring Cloud 微服务架构学习笔记 1》

一、开发工具与基础配置


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 用于远程服务调用:

  1. 在启动器类中添加:

    typescript 复制代码
    @Bean
       public RestTemplate restTemplate() {
           return new RestTemplate();
       }
  2. 使用 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决定了负载均衡的策略,可以通过以下两种方式修改:

  1. 代码方式(适用于所有服务):

    java 复制代码
    @Bean
    public IRule randomRule() {
        return new RandomRule();
    }
  2. 配置文件方式 (针对特定服务,如userservice):

    yaml 复制代码
     userservice:
           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

​ - 如果xxxdefault,则为全局配置。

​ - 如果xxx是服务名称(如userservice),则为特定服务配置。

2. Java 代码方式:

java 复制代码
   @Bean
   public Logger.Level feignLoggerLevel() {
       return Logger.Level.BASIC;
   }

​ - 在@EnableFeignClients注解中声明为全局配置。

​ - 在@FeignClient注解中声明为特定服务配置。

3. Feign 性能优化

优化 Feign 性能:

  1. 使用连接池代替默认的 URLConnection 连接,日志级别建议使用 Basicnone
  2. 引入 httpClient 依赖:
xml 复制代码
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
    </dependency>
  1. 配置文件:
yaml 复制代码
   feign:
       client:
           config:
               default:
                   loggerLevel: BASIC
       httpclient:
           enabled: true
           max-connections: 20
           max-connections-per-route: 50

4. Feign 最佳实践

Feign 的最佳实践有两种方式:

  1. 继承方式:服务端的 Controller 和客户端的 FeignClient 继承同一接口(契约思想)。
  2. 抽取方式:将 FeignClient、PoJo、Feign 的默认配置定义到一个项目中,消费者只需导入依赖即可(解耦合)。

5.实现抽取方式

实现 Feign 的抽取方式:

  1. 创建一个新的模块,命名为 feign-api,导入 Feign 的 starter 依赖。

  2. order-server 中的 UserClientUser、配置文件复制到 feign-api 中。

  3. order-service 中引入 feign-api 的依赖。

  4. 修改 order-service 中的 import 路径,改为导入 feign-api 中的包。

  5. 在启动器上添加注解,扫描 feign-api 中的 Bean:

    python 复制代码
    @EnableFeignClients(clients = {UserClient.class})

ini 复制代码
	@EnableFeignClients(basePackages = {"cn.itcast.feign.clients"})

六、Nacos 配置管理

1. 配置管理

Nacos 的配置管理:

  1. 在 Nacos 中添加需要热更新的配置文件([服务名称]-[profile].yaml)。
  2. 获取 Nacos 的依赖:
    • 引入 Nacos 配置管理客户端依赖(在父工程中配置版本)。

    • resources 文件夹中新建 bootstrap.yml 文件,配置 Nacos 的基本信息:

      yaml 复制代码
      spring:
        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 读取的配置文件:

  1. [服务名]-[spring.profile.active].yaml(环境配置)
  2. [服务名].yaml(共享环境配置) 配置优先级:[服务名]-[环境].yaml > [服务名].yaml > 本地配置

4.企业生产中,为了高可用性,则会进行 nacos 集群搭建


七、Sring Cloud Gateway

1.统一网关的作用

  1. 统一路径,并对用户请求做身份验证、权限校验。
  2. 将用户请求路由到微服务,并实现负载均衡
  3. 对用户请求做限流操作。

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 # 这次跨域检测的有效期
相关推荐
Justice link1 天前
Docker参数,以及仓库搭建
后端·spring·spring cloud
customer081 天前
【开源免费】基于SpringBoot+Vue.JS旅游管理系统(JAVA毕业设计)
java·vue.js·spring boot·spring cloud·开源
用户53866168248222 天前
SpringCloud实战 Gateway网关整合SpringSecurity 自定义过滤器执行多次原因及解决方案
分布式·spring cloud·微服务
xyzcto2 天前
通过Nacos API实现微服务不间断部署
运维·spring cloud·微服务·持续部署
无栈工程师3 天前
SpringCloud系列教程(十三):Sentinel流量控制
spring·spring cloud·sentinel
Java码农也是农3 天前
RabbitMQ的四种交换机
学习·spring cloud·rabbitmq
刘小炮吖i3 天前
Nacos简介、安装与使用(保姆级教程!!!)
spring cloud
李恩114 天前
常用的分布式ID设计方案
java·spring cloud
xiaogg36784 天前
kubectl 运行脚本 kubernetes 部署springcloud微服务 yaml + Dockerfile+shell 脚本
spring cloud·微服务·kubernetes