当前位置:   article > 正文

黑马guli商城项目初始化-SpringCloud微服务项目初始化使用SpringCloudAlibaba快速搭建分布式系统

黑马guli商城项目初始化-SpringCloud微服务项目初始化使用SpringCloudAlibaba快速搭建分布式系统

视频教程:https://www.bilibili.com/video/BV1np4y1C7Yf?p=4&spm_id_from=pageDriver&vd_source=0b3904471b2f8a3a133e05bd42f729a9

1.服务架构图

在这里插入图片描述
在这里插入图片描述

2.初始化目录结构

创建好项目选择需要的依赖,
在这里插入图片描述

在这里插入图片描述
创建完成后的结构
在这里插入图片描述
设置一个总项目,怕其他几个模块聚合起来。在添加到maven中

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.atguigu.gulimall</groupId>
    <artifactId>gulimall</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gulimall</name>
    <description>聚合服务</description>
    <packaging>pom</packaging>
    <modules>
        <module>gulimall-coupon</module>
        <module>gulimall-member</module>
        <module>gulimall-order</module>
        <module>gulimall-product</module>
        <module>gulimall-ware</module>
    </modules>
</project>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述
设置一下提交的git模板,避免提交垃圾文件

target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar

**/mvnw
**/mvnw.cmd

**/.mvn
**/target/

.idea

**/.gitignore
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

然后直接提交到仓库

3.初始化数据库

如题

4.使用逆向工程项目生成数据库CRUD

在这里插入图片描述

下载生成的mybatis文件内容,导入gulimall-product项目中

在这里插入图片描述

如果在逆向生成的时候有你不需要的注解,可以修改生成的,模板即可
在这里插入图片描述
修改那个模板就改那个template然后重新运行导入

5.创建工具项目

但是由于缺乏具体的工具类,所以还得新建一个组件共用的一个maven项目。
在这里插入图片描述
导入需要相关的工具依赖,例如mybatisplus

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atguigu.gulimall</groupId>
        <artifactId>gulimall</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>gulimall-common</artifactId>
    <description>微服务的公共组件</description>
    <name>Archetype - gulimall-common</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>
</project>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

然后前往product工程里面把这个项目共用的工具依赖加进去即可,在工具类里面补全缺少的工具依赖
在这里插入图片描述

        <dependency>
            <groupId>com.atguigu.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

6.配置mybatis-plus配置文件

在common依赖中加载mysql以及servlet

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atguigu.gulimall</groupId>
        <artifactId>gulimall</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>gulimall-common</artifactId>
    <description>微服务的公共组件</description>
    <name>Archetype - gulimall-common</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

6.0前往 product工程resources下配置好数据源

在这里插入图片描述

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.81.128:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后前往启动类添加注解
在这里插入图片描述

6.1告诉mybatisplus映射文件的位置

在application.yml添加

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.81.128:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  # 自增主键
  global-config:
    db-config:
      id-type: auto
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

7.配置SpringCloud Alibaba分布式组件快速搭建分布式系统

在这里插入图片描述

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用
微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布
式应用服务。依托 Spring CloudAlibaba, 您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用
接入阿里微服务解决方案,,通过阿里中间件来迅速搭建分布式应用系统。

为什么要用spring cloud alibaba

SpringCloud 的几大痛点
SpringCloud 部分组件停止维护和更新,给开发带来不便
SpinrgCloud部分环境搭建复杂,没有善的可视化界面,我们需要大量的二次开发和定制 SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用

SpringCloud Alibaba 的优势

阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用 成套的产品搭配完善的可视化界面给开发运维带来极大的便利

搭建简单,学习曲线低。

结合 SpringCloud Alibaba 我们最终的技术搭配方案:

SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)

SpringCloud Alibaba - Nacos:配置中心(动态配置管理)

SpringCloud - Ribbon:负载均衡

SpringCloud - Feign:声明式 HTTP 客户端(调用远程服务)

SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)

SpringCloud - Gateway:API 网 关 (webflux 编 程 模 式 )

SpringCloud - Sleuth:调用链监控

SpringCloud Alibaba - Seata:原 Fescar,即分布式事务解决方案

官方配置教程:
https://github.com/alibaba/spring-cloud-alibaba

7.1 Nacos 注册中心组件

官方配置教程:
https://github.com/alibaba/spring-cloud-alibaba/blob/2023.x/spring-cloud-alibaba-examples/nacos-example/readme-zh.md

导入注册发现依赖到common项目中加载依赖后其他服务也相当于拥有了服务注册发现功能

        <!--        服务注册/发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

下载nacos服务中心运行,因为是本机启动,需要修改startup,MODE修改为standalone修改成单机启动模式,不然用原来的集群启动会报错的。
在这里插入图片描述
在配置文件中指定注册中心的地址。改成nacos的8848端口。

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.56.10:3306/gulimall_sms
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        //注册中心的服务名
  application:
    name: gulimall-coupon

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

使用@EnableDiscoveryClient到启动类中添加注解。开启服务的注册发现功能

@EnableDiscoveryClient
@SpringBootApplication
public class GulimallCouponApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallCouponApplication.class, args);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行项目后就注册上来了。
在这里插入图片描述

7.2 使用OpenFeign远程调用

添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  • 1
  • 2
  • 3
  • 4

模拟一个远程服务,在Coupon项目中添加一个测试方法,用另一个项目通过feign来远程调用他。

   @RequestMapping("/member/list")
    public R membercoupons(){
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("满100减10");
        return R.ok().put("coupons",Arrays.asList(couponEntity));
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在需要另一个需要使用feign的启动类添加注解,@EnableFeignClients(basePackages = “com.atguigu.gulimall.member.feign”)

package com.atguigu.gulimall.member;

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

/**
 * 1、想要远程调用别的服务
 * 1)、引入open-feign
 * 2)、编写一个接口,告诉SpringCloud这个接口需要调用远程服务
 *   1、声明接口的每一个方法都是调用哪个远程服务的那个请求
 * 3)、开启远程调用功能
 */
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallMemberApplication.class, args);
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

并且在创建一个feign文件夹里面创建接口
这个接口就是用来声明远程调用的,用来调用那个项目里面的接口。

package com.atguigu.gulimall.member.feign;

import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 这是一个声明式的远程调用
 */
@FeignClient("gulimall-coupon")
public interface CouponFeignService {

    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

现在模拟Member使用Feign来远程调用接口。

    @Autowired
    //feign类        
    CouponFeignService couponFeignService;

    @RequestMapping("/coupons")
    public R test(){
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setNickname("张三");
		//远程调用接口,调用完成后会返回数据到实体类中
        R membercoupons = couponFeignService.membercoupons();
        return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons"));
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意
如果远程调用的服务不在nacos中的话是无法调用成功的。需要服务上线才能调用。

7.3 Nacos的配置中心

     <!--        配置中心来做配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

配置完成后在项目的 /src/main/resources/bootstrap.properties 中添加nacos的元数据;这个配置会优先于application加载。

Nacos 配置中心的主要特点如下:

集中管理:Nacos 配置中心提供了一个统一的配置管理界面,可以集中管理应用的配置信息,包括数据源、缓存、消息队列等各种配置。
动态刷新:Nacos 配置中心支持配置的动态刷新,当配置发生变化时,可以实时推送到客户端,无需重启应用。 版本控制:Nacos
配置中心支持配置的版本控制,可以方便地回滚到旧版本的配置。 高可用性:Nacos 配置中心具有高可用性,可以通过集群部署来保证服务的稳定性。
易于集成:Nacos 配置中心提供了丰富的客户端 SDK,可以方便地与各种编程语言和框架集成。

最主要的是他动态刷新功能,以往我们修改项目配置文件里面内容时候都得重新部署一遍才能看到效果,通过nacos配置文件动态刷新配置文件就可以解决这个问题,实现远程动态更新。

在nacos中创建远程配置
在这里插入图片描述在这里插入图片描述
配置完成后项目的application将会被远程配置文件的配置所覆盖。先会读取nacos里面的配置。
在这里插入图片描述
之后每次只需要修改nacos里面的配置文件就行。
需要在用到动态更新的类中添加
@RefreshScope注解

@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;


    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;

    @RequestMapping("/test")
    public R test(){

        return R.ok().put("name",name).put("age",age);
    }
   }
 }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

7.4 Nacos的命名空间和配置分组

 1)、命名空间:配置隔离;
 *      默认:public(保留空间);默认新增的所有配置都在public空间。
 *      1、开发,测试,生产:利用命名空间来做环境隔离。
 *         注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置,
 *         spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
 *      2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

7.4.1 新建命名空间

在这里插入图片描述
切换空间创建配置。每个空间的配置都是单独的。
在这里插入图片描述
让项目访问指定命名空间的配置文件。
在bootstrap配置文件下添加,添加后会访问指定空间的配置文件。如果不添加只会访问默认public命名空间的文件。

# Nacos 配置中心命名空间 id改成命名空间的id
spring.cloud.nacos.config.namespace=1986f4f3-69e0-43bb-859c-abe427b19f3a
  • 1
  • 2

也可以通过克隆来复制配置文件
在这里插入图片描述

7.4.2 创建配置集,配置文件分组

2)、配置集:所有的配置的集合
 *
 *  3)、配置集ID:类似文件名。
 *      Data ID:类似文件名
 *
 *  4)、配置分组:
 *      默认所有的配置集都属于:DEFAULT_GROUP;
 *      1111,618,1212
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

配置文件进行分组,例如双十一组双十二组的配置文件。
在这里插入图片描述
在这里插入图片描述
配置文件中添加

# Nacos 配置中心分组
spring.cloud.nacos.config.group=prod
  • 1
  • 2

来控制nacos远程访问的分组,比如准备双十二了就通过双十二的分组来加载双十二的配置文件。通过分组后可以隔离开不同场景下的配置文件
在这里插入图片描述

也可以在开发环境下通过分组来区分不同测试环境的配置文件。
  • 1

7.4.3 同时加载多个配置集

 3、同时加载多个配置集
 * 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
 * 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
 * 3)、@Value,@ConfigurationProperties。。。
 * 以前SpringBoot任何方法从配置文件中获取值,都能使用。
 * 配置中心有的优先使用配置中心中的,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

把多个配置文件的数据元给拆分后放到nacos的配置集中来管理。
存放数据库的数据元

在这里插入图片描述
存放mybatis的
在这里插入图片描述
其他配置
在这里插入图片描述
把整个项目的配置都拆分成了这几个文件
在这里插入图片描述
在通过配置项目中的nacos配置文件来同时加载多个数据源

# 数据源配置
# 数据源的名字
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
#分组
spring.cloud.nacos.config.ext-config[0].group=dev
#是否支持动态刷新 不支持那么就不会随着nacos的更新而更新
spring.cloud.nacos.config.ext-config[0].refresh=true

# MyBatis 配置
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

# 其他配置
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

启动后可以看到他读取了那些配置文件
在这里插入图片描述

7.4.4 总结

/**
 * 1、如何使用Nacos作为配置中心统一管理配置
 *
 * 1)、引入依赖,
 *         <dependency>
 *             <groupId>com.alibaba.cloud</groupId>
 *             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 *         </dependency>
 * 2)、创建一个bootstrap.properties。
 *      spring.application.name=gulimall-coupon
 *      spring.cloud.nacos.config.server-addr=127.0.0.1:8848
 * 3)、需要给配置中心默认添加一个叫 数据集(Data Id)gulimall-coupon.properties。默认规则,应用名.properties
 * 4)、给 应用名.properties 添加任何配置
 * 5)、动态获取配置。
 *      @RefreshScope:动态获取并刷新配置
 *      @Value("${配置项的名}"):获取到配置。
 *      如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。
 *
 * 2、细节
 *  1)、命名空间:配置隔离;
 *      默认:public(保留空间);默认新增的所有配置都在public空间。
 *      1、开发,测试,生产:利用命名空间来做环境隔离。
 *         注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置,
 *         spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
 *      2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
 *
 *  2)、配置集:所有的配置的集合
 *
 *  3)、配置集ID:类似文件名。
 *      Data ID:类似文件名
 *
 *  4)、配置分组:
 *      默认所有的配置集都属于:DEFAULT_GROUP;
 *      1111,618,1212
 *
 * 项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod
 *
 * 3、同时加载多个配置集
 * 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
 * 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
 * 3)、@Value,@ConfigurationProperties。。。
 * 以前SpringBoot任何方法从配置文件中获取值,都能使用。
 * 配置中心有的优先使用配置中心中的,
 *
 *
 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

完整配置文件

# 应用名称
spring.application.name=gulimall-coupon

# Nacos 配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心命名空间
spring.cloud.nacos.config.namespace=93362074-a698-42d9-9b75-c0a3aefea991
# Nacos 配置中心分组
# 优先覆盖application.properties里面的内容
spring.cloud.nacos.config.group=dev

# 数据源配置
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

# MyBatis 配置
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yaml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

# 其他配置
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

8 配置SpringCloud Gatway Api 网关

API网关在微服务架构中扮演着至关重要的角色,其主要功能如下:

  1. 请求路由:API网关负责将客户端的请求分发到相应的微服务,从而实现关注点的分离,并减轻客户端与底层微服务之间的耦合。
  2. 协议转换:API网关能够在不兼容的协议(如HTTP与gRPC或dubbo)之间进行转换,使得微服务可以通过各种协议进行发布。
  3. 负载均衡:通过在多个微服务实例之间分配请求流量,API网关有助于提高系统的性能和弹性。
  4. 缓存:API网关可以缓存频繁请求的数据,从而降低微服务的负载并缩短响应时间。
  5. 安全:API网关提供身份验证、授权和加密等安全功能,保护微服务免受未经授权的访问。
  6. 监控:API网关负责收集和聚合来自微服务的指标和日志,为系统管理员提供对整个系统运行状况和性能的实时洞察。

通过这些功能,API网关为开发人员提供了一种集中且便捷的方式来发布、保护和管理微服务,使得大型复杂系统的演进和维护变得更加轻松。

8.1初始化网关

创建一个新的模块项目选中Gateway来进行创建。
在这里插入图片描述
完整pom,如果遇到读取nacos地址为空的情况直接降低gatway版本

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.atguigu.gulimall</groupId>
    <artifactId>gulimall-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gulimall-gateway</name>
    <description>API网关</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.atguigu.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

添加依赖,如果不加载这个依赖那么就无法使用nacos的注册发现服务。

        <dependency>
            <groupId>com.atguigu.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
package com.gulimall.gateway;

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

/**
 * 开启服务注册发现
 */
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallGatewayApplication.class, args);
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

创建好application.properties配置文件

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88


  • 1
  • 2
  • 3
  • 4
  • 5

创建好bootstrap.properties配置文件

spring.application.name=gulimall-coupon
# 配置中心的地址 nacos的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=8516a6ce-7d54-4c7f-b704-3ef258ebaadd

  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
在nacos中创建好其配置文件
在这里插入图片描述
根据配置定义一个路由,创建一个application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: bd_route # 路由 ID,用于唯一标识该路由规则
          uri: https://www.baidu.com # 目标服务的 URI
          predicates: # 路由条件,用于匹配请求 Query是设置断言规则
            - Query=url,baidu

        - id: qq_route # 路由 ID,用于唯一标识该路由规则
          uri: https://www.qq.com # 目标服务的 URI
          predicates: # 路由条件,用于匹配请求 Query是设置断言规则
            - Query=url,qq
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

http://localhost:88/hello?url=baidu
  • 1
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号