Nacos+GateWay 搭建微服务架构

文章目录

    • 1.当前项目架构分析
        • 1.请求多个模块的方式
          • 1.请求renren-fast模块
            • 开发环境
            • 生产环境
          • 2.请求sunliving-commodity模块
            • 1.使用环境变量+资源路径的方式
            • 2.开发环境 dev.env.js
            • 3.生产环境 prod.env.js
          • 3.文件上传请求 sunliving-service模块
            • 1.请求后端接口(开发环境) policy.js
            • 2.请求阿里云OSS
        • 2.架构图
        • 3.加入改进后的架构图
    • 2.将三个微服务注册到Nacos
        • 1.配置Nacos1.1.3到云服务器
          • 1.GitHub下载压缩包
          • 2.上传到宝塔
          • 3.安装JDK8
            • 1.将压缩包放到/opt/jdk下
            • 2.进入/usr/local
            • 3.创建文件夹 java
            • 4.进入/opt/jdk
            • 5.解压缩到/usr/local/java
            • 6.进入 /usr/local/java/jdk1.8.0_261/bin 查看java版本
            • 7.准备配置环境变量,复制java的bin目录位置 pwd可以查看当前目录
            • 8.进入到环境变量的配置文件 `vim /etc/profile` ,移动到最后,配置环境变量
            • 9.刷新环境变量使其生效,然后输出一下查看
            • 10.输入 java -version,成功!
          • 4.安装目录一般在 /usr/local 目录下,我们可以在此目录下新建一个目录nacos
          • 5.进入这个软件目录
          • 6.解压缩到/usr/local下的nacos目录
          • 7.配置nacos的端口
            • 1.进入nacos的conf目录
            • 2.将cluster.conf.example文件复制命名为cluster.conf
            • 3.编辑这个文件,设置ip和端口,可以配置多个
          • 8进入安装目录 /usr/local/nacos/nacos/bin
          • 9.执行nacos
          • 10.宝塔和腾讯云都要开放8848端口
          • 11.访问 http://ip:8848/nacos 用户名和密码都是nacos
          • 12.nacos常用命令
            • 1.查看所有开放端口 firewall-cmd --list-all
            • 2.查看8848端口是否被占用 netstat -tulnp | grep 8848
            • 3.查看nacos进程 ps -ef | grep nacos
            • 4.重启nacos(修改配置文件之后重启)
        • 2.配置sunliving-common模块引入Nacos依赖
          • 1.使用dependencyManagement对本模块以及子模块进行版本仲裁
          • 2.引入Nacos的依赖
          • 3.目前状态
        • 3.三个模块配置Nacos
          • 1.sunliving-commodity模块配置Nacos
            • 1.application.yml 配置Nacos的服务地址和application的name
            • 2.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
            • 3.确保Nacos启动,然后启动这个模块,访问 http://ip:8848/nacos 注册成功!
          • 2.sunliving-service模块配置Nacos
            • 1.配置application.yml 配置Nacos的服务地址和application的name
            • 2.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
            • 3.启动测试
          • 3.配置renren-fast模块
            • 1.引入公共模块排除mybatis-plus-boot-starter,获取Nacos依赖
            • 2.配置application.yml 配置Nacos的服务地址和application的name
            • 3.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
          • 4.启动测试
    • 3.创建sunliving-gateway完成路由转发测试
        • 1.创建并配置sunliving-gateway模块
          • 1.创建sunliving-gateway模块
          • 2.检查父子模块
        • 2.参考sunliving-service模块引入依赖
        • 3.配置Nacos服务发现
          • 1.application.yml 配置端口,服务名,Nacos
          • 2.编写主启动类,开启服务发现
          • 3.启动测试
        • 4.配置GateWay完成测试
          • 1.测试一
            • 1.将请求转发到 http://localhost:9091/commodity/brand/list
            • 2.思路分析
            • 3.配置方式
            • 4.浏览器发送请求 localhost:5050/commodity/brand/list
          • 2.测试二
            • 1.将请求转发到 https://tieba.baidu.com/index.html
            • 2.请求方式 http://localhost:5050/index.html
            • 3.配置方式
            • 4.结果展示
    • 4.完成前端通过GateWay访问后端
        • 1.renren-fast 模块配置
          • 1.找到前端向这个模块发送请求的前缀(服务发现 + 上下文路径)
            • 1.进入adornUrl
            • 2.进入baseUrl
            • 3.进入index.js的
            • 4.找到开发环境的前缀了
          • 2.修改前缀为GateWay的服务发现 + "/api" + 后端资源的上下文路径
            • 1.renren-fast的上下文路径
            • 2.修改请求
          • 3.GateWay配置
          • 4.测试,出现跨域问题
          • 5.gateway添加配置类 SunlivingGatewayCorsConfiguration.java
          • 6.再次测试,显示有多个跨域配置,只允许有一个
          • 7.删除renren-fast本身的跨域配置,然后再次测试
        • 2.关于GateWay的配置
          • 1.前端的请求方式
          • 2.后端的要求
          • 3.GateWay的配置解析
          • 4.GateWay配置模板
          • 5.注意事项
        • 3.sunliving-commodity 模块配置
          • 1.application.yml 配置后端项目的上下文路径
          • 2.找到前端发送请求的方式
            • 1.环境变量 + 资源路径的方法
            • 2.找到开发环境的环境变量,修改为GateWay的服务发现 + /api + 目标资源的上下文路径
          • 3.进行GateWay的配置(按照模板来即可)
          • 4.启动测试
            • 1.还是多个跨域配置的问题
            • 2.注销sunliving-commodity模块的跨域配置
            • 3.重启测试
        • 4.目前这种配置方式的分析
          • 1.缺点
          • 2.改进方式:使用明确的环境变量来区分不同微服务
          • 3.修改开发环境的BASEPATH
          • 4.将用到这个环境变量的请求替换一下
          • 5.重启测试
        • 5.设置OSS权限
          • 1.如果不希望被读,就将读写权限设置为私有
          • 2.控制上传文件权限
            • 1.进入RAM控制台
            • 2.删除用户即可
        • 6.sunliving-service模块的配置
          • 1.分析
            • 1.这个模块主要是用来返回OSS的签名的,所以只有文件上传部分调用了这个接口
            • 2.singleUpload.vue 指定的是对象存储的地址,不需要改
            • 3.src/components/upload/policy.js是向后端sunliving-service模块发送的请求,需要区分多环境并交给网关统一控制
          • 2.后端 application.yml 配置上下文路径
          • 3.前端开发环境配置环境变量,区分多环境
          • 4.policy.js 通过环境变量 + 资源路径的方式请求到后端
          • 5.配置GateWay
          • 6.启动测试
            • 1.报错在brower.js:158:202
            • 2.进入看看,发现是刚才的环境变量配置的有问题
            • 3.修改一下即可
            • 4.修改了环境变量需要重启项目,再次测试,此时发现又是跨域配置过多的问题
            • 5.把这个sunliving-service的跨域配置注销即可
            • 6.再次启动,成功!
        • 7.使用GateWay进行路由转发总结
          • 1.前提条件:后端配置了上下文路径
          • 2.前端发送请求方式
          • 3.GateWay配置模板(仅限目前的规范)
          • 4.GateWay添加配置类,处理跨域问题(这样其他微服务就不需要处理跨域了)
          • 5.关于前端区分多环境的细节说明
        • 8.Nacos配置中心的使用
          • 1.修改Nacos的密码保证安全
          • 2.对sunliving-service的依赖进行版本仲裁
          • 3.引入nacos的配置中心依赖
          • 4.在Nacos中创建配置文件
            • 1.新建命名空间
            • 2.进入配置列表,选中刚才的命名空间,点击加号
            • 3.进行配置
            • 4.将application.yml的部分配置放到配置中心
            • 5.点击发布
            • 6.查看配置列表
          • 5.编写bootstrap.properties来读取配置中心的文件(也可以使用)
        • 9.为网关设置配置中心,使其可以动态配置网关信息
          • 1.引入nacos的配置中心依赖
          • 2.新建命名空间
          • 3.新建配置
          • 4.查看配置
          • 5.创建bootstrap.properties文件,填写信息
          • 6.重启测试
            • 1.可以读取到端口信息,但是网关配置一直不生效
            • 2.把这个application和nacos的服务发现配置也放到配置中心就好了(下次粘贴配置的时候就完整粘贴就好)

1.当前项目架构分析

1.请求多个模块的方式
1.请求renren-fast模块
开发环境

image-20240414145711877

生产环境

2.请求sunliving-commodity模块
1.使用环境变量+资源路径的方式

image-20240414150215611

2.开发环境 dev.env.js

image-20240414150255377

3.生产环境 prod.env.js

3.文件上传请求 sunliving-service模块
1.请求后端接口(开发环境) policy.js

image-20240414150355829

2.请求阿里云OSS

image-20240414150524989

2.架构图

image-20240414152221718

3.加入改进后的架构图

image-20240414154024066

2.将三个微服务注册到Nacos

1.配置Nacos1.1.3到云服务器
1.GitHub下载压缩包

nacos-server-1.1.3.tar.gz

image-20240414160104418

2.上传到宝塔

image-20240414160157194

3.安装JDK8
1.将压缩包放到/opt/jdk下

image-20240414162840045

2.进入/usr/local

image-20240414163339376

3.创建文件夹 java

image-20240414163441317

4.进入/opt/jdk

image-20240414163523535

5.解压缩到/usr/local/java
tar -zxvf jdk-8u261-linux-x64.tar.gz -C /usr/local/java
6.进入 /usr/local/java/jdk1.8.0_261/bin 查看java版本
./java -version

image-20240414164059636

7.准备配置环境变量,复制java的bin目录位置 pwd可以查看当前目录
/usr/local/java/jdk1.8.0_261/bin
8.进入到环境变量的配置文件 vim /etc/profile ,移动到最后,配置环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH

image-20240414164859120

9.刷新环境变量使其生效,然后输出一下查看
source /etc/profile
echo $PATH

image-20240414164639283

10.输入 java -version,成功!

image-20240414164937186

4.安装目录一般在 /usr/local 目录下,我们可以在此目录下新建一个目录nacos
cd /usr/local
mkdir nacos

image-20240414161145310

5.进入这个软件目录
cd /www/nacos1.1.3/

image-20240414160833995

6.解压缩到/usr/local下的nacos目录
tar -zxvf nacos-server-1.1.3.tar.gz -C /usr/local/nacos/
7.配置nacos的端口
1.进入nacos的conf目录

image-20240414171034169

2.将cluster.conf.example文件复制命名为cluster.conf
cp cluster.conf.example cluster.conf
3.编辑这个文件,设置ip和端口,可以配置多个
vim cluster.conf

8进入安装目录 /usr/local/nacos/nacos/bin

image-20240414165235587

9.执行nacos
./startup.sh

image-20240414171504171

10.宝塔和腾讯云都要开放8848端口
11.访问 http://ip:8848/nacos 用户名和密码都是nacos

image-20240414172100876

12.nacos常用命令
1.查看所有开放端口 firewall-cmd --list-all

image-20240414171648558

2.查看8848端口是否被占用 netstat -tulnp | grep 8848

image-20240414171751433

3.查看nacos进程 ps -ef | grep nacos

image-20240414171842244

4.重启nacos(修改配置文件之后重启)
./startup.sh -m standalone
2.配置sunliving-common模块引入Nacos依赖
1.使用dependencyManagement对本模块以及子模块进行版本仲裁
    <!-- 对本模块以及子模块进行版本仲裁 -->
    <dependencyManagement>
        <dependencies>
            <!-- 指定spring-cloud-alibaba-dependencies的版本为2.1.0,对本模块以及子模块进行版本仲裁 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version> <!-- 确保这里的版本号是正确的 -->
                <!-- 这里的type是pom,scope是import,表示这个依赖是导入依赖,不会参与编译和打包,可以解决单继承问题 -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
2.引入Nacos的依赖
        <!-- 引入nacos服务注册和发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <!-- <version>2.1.0.RELEASE</version> 这里使用版本仲裁-->
        </dependency>
3.目前状态
  1. sunliving-common模块的Nacos版本被自己版本仲裁了为2.1.0
  2. sunliving-commodity和sunliving-service引入了sunliving-common模块所以也有Nacos2.1.0依赖
3.三个模块配置Nacos
1.sunliving-commodity模块配置Nacos
1.application.yml 配置Nacos的服务地址和application的name

2.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现

image-20240414193226144

3.确保Nacos启动,然后启动这个模块,访问 http://ip:8848/nacos 注册成功!

image-20240414193501500

2.sunliving-service模块配置Nacos
1.配置application.yml 配置Nacos的服务地址和application的name

2.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现

image-20240414194559654

3.启动测试

image-20240414195032395

3.配置renren-fast模块
1.引入公共模块排除mybatis-plus-boot-starter,获取Nacos依赖
		<!-- 公共模块 -->
		<dependency>
			<groupId>com.sun.sunliving</groupId>
			<artifactId>sunliving-common</artifactId>
			<version>1.0-SNAPSHOT</version>
			<exclusions>
				<exclusion>
					<groupId>com.baomidou</groupId>
					<artifactId>mybatis-plus-boot-starter</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
2.配置application.yml 配置Nacos的服务地址和application的name
3.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现

image-20240414200510154

4.启动测试

image-20240414200733229

3.创建sunliving-gateway完成路由转发测试

1.创建并配置sunliving-gateway模块
1.创建sunliving-gateway模块

image-20240414201409194

2.检查父子模块

image-20240414201523619

image-20240414201605981

2.参考sunliving-service模块引入依赖
    <!-- 添加描述信息 -->
    <description>sun(家居生活)-网关服务</description>

    <!-- 导入SpringBoot父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- 当parent的groupId没有指向父工程时就需要加 -->
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <!-- SpringCloud版本 2020.0.5-->
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
        <!-- 解决java: -source 1.5 中不支持 diamond 运算符 问题 -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <!-- 这里直接获取properties里面的版本号 -->
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- SpringCloud网关模块 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <!-- <version>2.2.1.RELEASE</version> 使用版本仲裁-->
        </dependency>
        <!-- SpringBoot web模块必须拿掉,否则会报错!!! -->
        <!-- <dependency> -->
        <!--     <groupId>org.springframework.boot</groupId> -->
        <!--     <artifactId>spring-boot-starter-web</artifactId> -->
        <!-- </dependency> -->
        <!-- SpringBoot test模块 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 公共模块 -->
        <dependency>
            <groupId>com.sun.sunliving</groupId>
            <artifactId>sunliving-common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <!-- 排除mybatis-plus-boot-starter, 因为不使用,就不会配置application.yml的mybatis-plus的部分,不排除会报错 -->
            <exclusions>
                <exclusion>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <!-- maven打包常规配置 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
3.配置Nacos服务发现
1.application.yml 配置端口,服务名,Nacos
server:
  port: 5050
spring:
  application:
    name: sunliving-gateway # Name of the application
  cloud:
    nacos:
      discovery:
        server-addr: ip:8848 # nacos服务地址

2.编写主启动类,开启服务发现
package com.sun.sunliving.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/4/14 20:40
 * @Version 1.0
 */
@SpringBootApplication
@EnableDiscoveryClient  // 开启服务注册与发现
public class SunlivingGateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(SunlivingGateWayApplication.class, args);
    }
}

3.启动测试

image-20240414204412163

4.配置GateWay完成测试
1.测试一
1.将请求转发到 http://localhost:9091/commodity/brand/list

image-20240414211537847

2.思路分析
  • 请求方式:服务发现 + 上下文路径 + 资源路径

  • 这里要想通过GateWay请求到这个网址,请求方式为GateWay服务发现 + 目标的上下文路径 + 资源路径

  • 所以请求方式=http://localhost:5050/commodity/brand/list

  • uri的编写就是目标的服务发现

  • 断言的编写方式为目标的上下文路径+资源路径,

  • 一旦断言成功,就会按照uri与断言的路径拼接也就是目标的服务发现 + 上下文路径 + 资源路径

3.配置方式
    gateway: # Gateway configuration
      routes: # 可以有多个路由
        - id: test_routes # Route ID 保证唯一即可
          uri: lb://sunliving-commodity # Target service
          predicates: # Predicates
            - Path=/commodity/brand/**
4.浏览器发送请求 localhost:5050/commodity/brand/list

2.测试二
1.将请求转发到 https://tieba.baidu.com/index.html
2.请求方式 http://localhost:5050/index.html
3.配置方式
        - id: sunliving-order
          uri: https://tieba.baidu.com
          predicates:
            - Path=/index.html
4.结果展示

4.完成前端通过GateWay访问后端

1.renren-fast 模块配置
1.找到前端向这个模块发送请求的前缀(服务发现 + 上下文路径)
1.进入adornUrl

image-20240414221808484

2.进入baseUrl

image-20240414221842348

3.进入index.js的

image-20240414221909996

4.找到开发环境的前缀了

image-20240414221950214

2.修改前缀为GateWay的服务发现 + “/api” + 后端资源的上下文路径
1.renren-fast的上下文路径

image-20240414222613785

2.修改请求

image-20240415102958792

3.GateWay配置
    gateway: # Gateway configuration
      routes: # 可以有多个路由
        - id: renren-fast # Route ID 保证唯一即可
          uri: lb://renren-fast # 服务发现
          predicates: # Predicates
            - Path=/api/renren-fast/** # 这里将得到的请求路径断言一下
          filters: # 重写路径,将/api/renren-fast/xxx重写为/renren-fast/xxx,此时与上面的服务发现拼接,得到最终的请求路径,也就是把/api拿掉
            - RewritePath=/api/(?<segment>.*), /$\{segment} 
4.测试,出现跨域问题

image-20240414225222853

5.gateway添加配置类 SunlivingGatewayCorsConfiguration.java
package com.sun.sunliving.gateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
// 注意这个包别引错了
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/4/15 10:17
 * @Version 1.0
 */
@Configuration
public class SunlivingGatewayCorsConfiguration {
    @Bean
    public CorsWebFilter corsWebFilter() {
        System.out.println("enter....");
        UrlBasedCorsConfigurationSource source = new
                UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 1、配置跨域
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.setAllowCredentials(true);
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsWebFilter(source);
    }
}

6.再次测试,显示有多个跨域配置,只允许有一个

image-20240415103123253

7.删除renren-fast本身的跨域配置,然后再次测试

image-20240415103303213

image-20240415103518263

2.关于GateWay的配置
1.前端的请求方式
  • GateWay的服务发现 + /api + 目标资源的上下文路径 + 资源路径
2.后端的要求
  • 统一设置上下文路径,便于管理
3.GateWay的配置解析
  • uri 配置的目标资源的服务发现
  • predicates 断言 /api + 目标资源的上下文路径 + 资源路径 需要得到 目标资源的上下文路径 + 资源路径
  • 所以需要将/api去掉 (?.*) 表示/api后面的部分,会填充到这个标签中/$\{segment} 这样就得到了目标资源的上下文路径 + 资源路径
  • 最后会将目标资源的服务发现 + 上下文路径 + 资源路径拼接,最终找到资源
  • 注意segment可以换名称只需要保证两个的名字相同即可
    gateway: # Gateway configuration
      routes: # 可以有多个路由
        - id: renren-fast # Route ID 保证唯一即可
          uri: lb://renren-fast # 服务发现
          predicates: # Predicates
            - Path=/api/renren-fast/** # 这里将得到的请求路径断言一下
          filters: # 重写路径,将/api/renren-fast/xxx重写为/renren-fast/xxx,此时与上面的服务发现拼接,得到最终的请求路径,也就是把/api拿掉
            - RewritePath=/api/(?<segment>.*), /$\{segment} 
4.GateWay配置模板
    gateway: # Gateway 配置
      routes: # 可以有多个路由
        - id: renren-fast # 保证唯一即可
          uri: lb://目标资源的application名称 # 服务发现,lb:表示负载均衡
          predicates: # 断言
            - Path=/api/目标资源上下文路径/** 
          filters: # 重写路径,将/api/上下文路径/** 转换为 /上下文路径/**
            - RewritePath=/api/(?<segment>.*), /$\{segment}
5.注意事项

如果在配置中有一个更精确的路径断言应该放到前面否则会报错

image-20240415125636590

3.sunliving-commodity 模块配置
1.application.yml 配置后端项目的上下文路径

image-20240415105803584

2.找到前端发送请求的方式
1.环境变量 + 资源路径的方法

image-20240415105905680

2.找到开发环境的环境变量,修改为GateWay的服务发现 + /api + 目标资源的上下文路径

image-20240415110137421

3.进行GateWay的配置(按照模板来即可)
        - id: sunliving-commodity # 保证唯一即可
          uri: lb://sunliving-commodity # 服务发现,lb:表示负载均衡
          predicates: # 断言
            - Path=/api/sunliving-commodity/**
          filters: # 重写路径,将/api/上下文路径/** 转换为 /上下文路径/**
            - RewritePath=/api/(?<segment>.*), /$\{segment}
4.启动测试
1.还是多个跨域配置的问题

image-20240415110723525

2.注销sunliving-commodity模块的跨域配置

image-20240415110833386

3.重启测试

image-20240415112412117

4.目前这种配置方式的分析
1.缺点
  • 目前的环境变量 + 资源路径的方式,一旦新增加一个微服务,就需要新增一个环境变量,但是目前使用BASEPATHD的方式就很难区分
2.改进方式:使用明确的环境变量来区分不同微服务
3.修改开发环境的BASEPATH

image-20240415124441050

4.将用到这个环境变量的请求替换一下
  • category.vue
  • brand.vue
  • brand-add-or-update.vue
5.重启测试

image-20240415125229473

image-20240415125223063

5.设置OSS权限
1.如果不希望被读,就将读写权限设置为私有

image-20240415141141489

2.控制上传文件权限
1.进入RAM控制台

image-20240415141308286

2.删除用户即可

image-20240415141417062

6.sunliving-service模块的配置
1.分析
1.这个模块主要是用来返回OSS的签名的,所以只有文件上传部分调用了这个接口
2.singleUpload.vue 指定的是对象存储的地址,不需要改

image-20240415141834748

3.src/components/upload/policy.js是向后端sunliving-service模块发送的请求,需要区分多环境并交给网关统一控制

image-20240415141923028

2.后端 application.yml 配置上下文路径

image-20240415142344292

3.前端开发环境配置环境变量,区分多环境
  • 环境变量配置为 GateWay服务发现 + /api + 上下文路径

image-20240415142716930

4.policy.js 通过环境变量 + 资源路径的方式请求到后端

image-20240415143215784

5.配置GateWay
        - id: sunliving-service # 保证唯一即可
          uri: lb://sunliving-service # 服务发现,lb:表示负载均衡
          predicates: # 断言
            - Path=/api/sunliving-service/**
          filters: # 重写路径,将/api/上下文路径/** 转换为 /上下文路径/**
            - RewritePath=/api/(?<segment>.*), /$\{segment}  
6.启动测试
1.报错在brower.js:158:202

image-20240415144455645

2.进入看看,发现是刚才的环境变量配置的有问题

image-20240415144546520

image-20240415144612635

3.修改一下即可

image-20240415144653059

4.修改了环境变量需要重启项目,再次测试,此时发现又是跨域配置过多的问题

image-20240415144841731

5.把这个sunliving-service的跨域配置注销即可

image-20240415145434488

6.再次启动,成功!

image-20240415145726391

7.使用GateWay进行路由转发总结
1.前提条件:后端配置了上下文路径
2.前端发送请求方式
  • GateWay服务发现 + /api + 目标资源的上下文路径 + 资源路径
  • 注意:这个/api是自定义的规范,不是必须的,也可以有其他的方式
3.GateWay配置模板(仅限目前的规范)
    gateway: # Gateway 配置
      routes: # 可以有多个路由
        - id: renren-fast # 保证唯一即可
          uri: lb://目标资源的application名称 # 服务发现,lb:表示负载均衡
          predicates: # 断言
            - Path=/api/目标资源上下文路径/** 
          filters: # 重写路径,将/api/上下文路径/** 转换为 /上下文路径/**
            - RewritePath=/api/(?<segment>.*), /$\{segment}
4.GateWay添加配置类,处理跨域问题(这样其他微服务就不需要处理跨域了)
package com.sun.sunliving.gateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/4/15 10:17
 * @Version 1.0
 */
@Configuration
public class SunlivingGatewayCorsConfiguration {
    @Bean
    public CorsWebFilter corsWebFilter() {
        System.out.println("enter....");
        UrlBasedCorsConfigurationSource source = new
                UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 1、配置跨域
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.setAllowCredentials(true);
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsWebFilter(source);
    }
}

5.关于前端区分多环境的细节说明
  • 首先查看所有的后端模块,一个一个看,找到每一个模块对应的所有前端请求
  • 对于前端请求使用环境变量 + 资源路径的方式区分多环境
  • 一个微服务模块配置一个环境变量,内容为GateWay服务发现 + /api + 上下文路径 这样再加上资源路径,就可以访问到目标资源
8.Nacos配置中心的使用
1.修改Nacos的密码保证安全

image-20240415152720119

image-20240415152703766

2.对sunliving-service的依赖进行版本仲裁
    <!-- 对本模块以及子模块进行版本仲裁 -->
    <dependencyManagement>
        <dependencies>
            <!-- 指定spring-cloud-alibaba-dependencies的版本为2.1.0,对本模块以及子模块进行版本仲裁 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version> <!-- 确保这里的版本号是正确的 -->
                <!-- 这里的type是pom,scope是import,表示这个依赖是导入依赖,不会参与编译和打包,可以解决单继承问题 -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

image-20240415153401380

3.引入nacos的配置中心依赖
        <!-- 引入nacos的配置中心依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
4.在Nacos中创建配置文件
1.新建命名空间

image-20240415154453093

image-20240415154400261

2.进入配置列表,选中刚才的命名空间,点击加号

image-20240415154434506

3.进行配置

image-20240415154615459

4.将application.yml的部分配置放到配置中心

image-20240415154811738

5.点击发布

image-20240415154911328

6.查看配置列表

image-20240415154953679

5.编写bootstrap.properties来读取配置中心的文件(也可以使用)
#注册到 nacos 的名字
spring.application.name=sunliving-service
#指定 nacos 的发现注册地址
spring.cloud.nacos.discovery.server-addr=ip:8848
#指定 nacos 的配置地址
spring.cloud.nacos.config.server-addr=ip:8848
#要获取的配置文件所在的配置空间
spring.cloud.nacos.config.namespace=830a1d44-4c4a-d708a9548c1c
#配置空间的哪一个组, 这个组下可以有多个配置文件,通过 ext-config[?] 来指定要加载某空间下的某组的第几个文件
spring.cloud.nacos.config.group=dev
#通过 ext-config[?] 来指定要加载某空间下的某组的第几个文件
spring.cloud.nacos.config.ext-config[0].data-id=application.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
9.为网关设置配置中心,使其可以动态配置网关信息
1.引入nacos的配置中心依赖
        <!-- 引入nacos的配置中心依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
2.新建命名空间

image-20240415170838418

3.新建配置

image-20240415171054097

image-20240415171729313

4.查看配置

image-20240415171125682

5.创建bootstrap.properties文件,填写信息
#注册到 nacos 的名字
spring.application.name=sunliving-gateway
#指定 nacos 的发现注册地址
spring.cloud.nacos.discovery.server-addr=ip:8848
#指定 nacos 的配置地址
spring.cloud.nacos.config.server-addr=ip:8848
#要获取的配置文件所在的配置空间
spring.cloud.nacos.config.namespace=10f6a704-5d7f82519ba4
#配置空间的哪一个组, 这个组下可以有多个配置文件,通过 ext-config[?] 来指定要加载某空间下的某组的第几个文件
spring.cloud.nacos.config.group=DEFAULT_GROUP
#通过 ext-config[?] 来指定要加载某空间下的某组的第几个文件
spring.cloud.nacos.config.ext-config[0].data-id=application.yml
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
6.重启测试
1.可以读取到端口信息,但是网关配置一直不生效
2.把这个application和nacos的服务发现配置也放到配置中心就好了(下次粘贴配置的时候就完整粘贴就好)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/630183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode - 周赛397

目录 一&#xff0c;3146. 两个字符串的排列差 二&#xff0c;3147. 从魔法师身上吸取的最大能量 三&#xff0c;3148. 矩阵中的最大得分 四&#xff0c;3149. 找出分数最低的排列 一&#xff0c;3146. 两个字符串的排列差 本题就是求同一个字符在两个字符串中的下标之差的…

一物一码数字化营销进军调味品行业,五丰黎红“星厨俱乐部”火啦!

近日&#xff0c;由五丰黎红联合纳宝科技精心打造的小程序“星厨俱乐部”火啦&#xff01;一经上线就吸引了大量用户注册和参与&#xff0c;可以说取得了非常成功的市场反馈&#xff0c;那究竟是一个什么样的小程序&#xff0c;竟然有这么大的吸引力呢&#xff1f; 介绍小程序之…

C++ requires关键字简介

requires 是 C20 中引入的一个新关键字&#xff0c;用于在函数模板或类模板中声明所需的一组语义要求&#xff0c;它可以用来限制模板参数&#xff0c;类似于 typename 和 class 关键字。 requires关键字常与type_traits头文件下类型检查函数匹配使用&#xff0c;当requires后…

视频监控系统中,可变码率和固定码率对录像文件存储大小的影响,如何配置比较好?

目录 一、问题描述 二、视频监控的录像文件计算 &#xff08;一&#xff09;计算方法 &#xff08;二&#xff09;计算工具 三、原因分析 &#xff08;一&#xff09;检查配置 1、IPCa配置 2、IPCb配置 3、录像文件存储大小的理论值 &#xff08;二&#xff09;实际情…

五丰黎红引领新营销模式:布局一物一码数字化营销,提高调味品销量和复购率

调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a;3&#xff1a;1&#xff0c;餐饮行业是调味品行业的供需主力。在餐饮行业中&#xff0c;“大厨”这一角色具有十分重要的地位。因此&#xff0c;借助大厨的力量成为了许多调味品…

汇聚荣科技:如何有效为拼多多店铺引流?

在电商竞争激烈的今天&#xff0c;为拼多多店铺引流是每个店主必须面对的挑战。有效的引流策略不仅能增加店铺曝光度&#xff0c;还能提升转化率&#xff0c;促进销量增长。 一、社交媒体营销 利用微信、微博等社交平台进行推广&#xff0c;可以通过发布产品信息、用户评价和促…

985大学电子信息专硕,考C语言+数据结构!中央民族大学25计算机考研考情分析!

中央民族大学&#xff08;Minzu University of China&#xff09;坐落于北京市学府林立的海淀区&#xff0c;南邻国家图书馆&#xff0c;北依中关村科技园&#xff0c;校园环境典雅&#xff0c;古朴幽美&#xff0c;人文氛围浓郁&#xff0c;具有鲜明的民族特色。由北京市、国家…

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的&#xff1a; 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题&#xff0c;作者决定分多次发布。 面向对象的引入 J…

GAME101-Lecture07学习

前言 今天主要讲shading&#xff08;着色&#xff09;。在讲着色前&#xff0c;要先讲图形中三角形出现遮挡问题的方法&#xff08;深度缓存或缓冲&#xff09;。 先采样再模糊错误&#xff1a;对信号的频谱进行翻译&#xff08;在这期间会有频谱的混叠&#xff09;&#xff…

Anaconda安装-超详细版(2024)

扫盲&#xff1a;先装Python还是先装anaconda? 安装anaconda即可&#xff0c;不需要单独装python anaconda 是一个python的发行版&#xff0c;包括了python和很多常见的软件库, 和一个包管理器conda。 一、下载Anaconda 安装包&#xff08;官网和国内镜像资源&#xff09; …

【强化学习】DQN类算法的一些理解

一、DQN算法为什么要使用两个网络&#xff1f; DQN算法通常包含两个网络&#xff1a;一个是评估网络training_network&#xff0c;另一个是目标网络target_network。这两个网络的结构和初始权重是相同的&#xff0c;但它们的权重是不同步更新的。使用两个网络的原因是为了稳定…

vue3.0+antdv的admin管理系统vue-admin-beautiful推荐

前言 几年前&#xff0c;笔者自学了vue这一优秀的前端框架&#xff0c;但苦于没项目练手&#xff0c;无意间发现了vue-admin-beautiful这一优秀的前端集成框架。当时就使用它做了一很有意思的小项目---终端监控云平台&#xff0c;实现了前端和后台的整体功能。整体方案介绍参见…

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…

文件存储解决方案-阿里云OSS

文章目录 1.菜单分级显示问题1.问题引出1.苹果灯&#xff0c;放到节能灯下面也就是id大于1272.查看菜单&#xff0c;并没有出现苹果灯3.放到灯具下面id42&#xff0c;就可以显示 2.问题分析和解决1.判断可能出现问题的位置2.找到递归返回树形菜单数据的位置3.这里出现问题的原因…

一文读懂云渲染与离线渲染的关系是什么

云渲染和离线渲染是什么关系呢&#xff1f;在渲染过程中经常会有人听到云渲染、离线渲染&#xff0c;然而两者的关系却有很多人都不清楚&#xff0c;下面一起来简单看看两者之间的关系吧。 1、渲染目的和过程&#xff1a; - 离线渲染&#xff1a;通常用于创建高质量的静态图像…

每日复盘-20240515

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 国联证券 (1)|[9:25]|[133765万]|31.12 一…

单位个人怎样向报社的报纸投稿?

作为一名单位的信息宣传员,我肩负着每月定期在媒体上投稿发表文章的重任。然而,在投稿的道路上,我经历了不少波折和挫折。 一开始,我天真地以为只要将稿件发送到报社的投稿邮箱,就能轻松完成任务。然而,现实却远比我想象的复杂。邮箱投稿的竞争异常激烈,编辑们会在众多稿件中挑…

【35分钟掌握金融风控策略28】贷中模型体系策略应用

目录 贷中模型体系策略应用 信用模型体系和模型在策略中的应用 反欺诈模型体系和模型在策略中的应用 运营模型体系和模型在策略中的应用 贷中模型体系策略应用 在贷前模型部分已经讲过&#xff0c;贷前开发的很多模型是可以在贷中直接使用的。贷中与贷前的不同点在于&…

不相交集合的数据结构

一、不相交集合的操作 不相交集合的数据结构维护了一组不相交动态集的集合 &#xff0c;用集合中的某个成员作为代表标识集合。 集合在没有修改的情况下每次访问代表得到的答案是相同的&#xff0c;此外在其它一些应用中&#xff0c;可能按照规定选择集合的代表&#xff0c;例如…

es 分词器(五)之elasticsearch-analysis-jieba 8.7.0

es 分词器&#xff08;五&#xff09;之elasticsearch-analysis-jieba 8.7.0 今天咱们就来讲一下es jieba 8.7.0 分词器的实现&#xff0c;以及8.x其它版本的实现方式&#xff0c;如果想直接使用es 结巴8.x版本&#xff0c;请直接修改pom文件的elasticsearch.version版本号即可…