搭建分布式系统基本环境

引入spring-cloud-alibaba依赖

在common的pom.xml中加入 ,下面是依赖管理,相当于以后再dependencies里引spring cloud alibaba就不用写版本号, 全用dependencyManagement进行管理:

<dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-alibaba-dependencies</artifactId>
             <version>2.1.0.RELEASE</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
</dependencyManagement>

Nacos作为注册中心

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 作为我们的注册中心和配置中心。

首先,修改 common中的pom.xml 文件,引入 Nacos Discovery Starter。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在应用的common中的application.yml 配置文件中配置 Nacos Server 地址和微服务名称

spring:
  application:
    name: gulimall-coupon
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 12345678
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
server:
  port: 7000

然后需要配置nacos服务器的地址,也就是注册中心地址,但是我们还没 有nacos服务器,所以我们需要启动nacos server创建nacos服务 器(软件官方可以下载)

image-20220118141248148

使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

image-20220118141440452

访问http://127.0.0.1:8848/nacos/ 账号密码nacos,出现如下页面,则表示访问成功

image-20220118141523315

Feign 远程调用

image-20220118141709670

会员服务想要远程调用优惠券服务,只需要给会员服务里引入 openfeign依赖,他就有了远程调用其他服务的能力。

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

使用注解:@EnableFeignClients(basePackages=“com.yxj.gulimall.member.feign”)

开启远程调用功能,并指明调用服务的service 的包名

image-20220118142342878

image-20220118142205584

Nacos作为配置中心

可以用nacos作为配置中心。配置中心的意思是不在application.properties 等文件中配置了,而是放到nacos配置中心公用,这样无需每台机器都改。

引入配置中心依赖,放到common中

<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

在coupons项目中创建/src/main/resources/bootstrap.properties ,这个文件是
springboot里规定的,他优先级别application.properties高

# 改名字,对应nacos里的配置文件名
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=192.168.11.1:8848

浏览器去nacos里的配置列表,点击+号,data ID:gulimall-coupon.properties,配置 gulimall-coupon.properties

 coupon.user.name="张三"
 coupon.user.age=12

动态获取配置(优先使用配置中心的值)

image-20220118143616856

例如:@Value(“${coupon.user.name}”)

Nacos配置中心进阶

在nacos浏览器中还可以配置:

命名空间:用作配置隔离。(一般每个微服务一个命名空间)

默认public。默认新增的配置都在public空间下

在这里插入图片描述

开发、测试、开发可以用命名空间分割。properties每个空间有一份。在bootstrap.properties里配置

# 可以选择对应的命名空间 ,即写上对应环境的命名空间ID
spring.cloud.nacos.config.namespace=b176a68a-6800-4648-833b-be10be8bab00  	

​ 也可以为每个微服务配置一个命名空间,微服务互相隔离

配置集:一组相关或不相关配置项的集合。

配置集ID:类似于配置文件名,即Data ID,也相当于(application.properties)

在这里插入图片描述

配置分组:默认所有的配置集都属于DEFAULT_GROUP。自己可以创建分组,比如双十一,618,双十二

image-20220118144629869

# 默认配置分组
spring.cloud.nacos.config.group=DEFAULT_GROUP  
# 开发环境组
spring.cloud.nacos.config.group=dev
# 测试环境组
spring.cloud.nacos.config.group=test
# 生产环境组
spring.cloud.nacos.config.group=prop
# 双十一环境组
spring.cloud.nacos.config.group=1111

最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)

Nacos加载多配置集

我们要把原来application.yml里的内容都分文件抽离出去。我们在nacos里创建好后,在coupons里指定要导入的配置即可。

datasource.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.1.103:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 12345678

mybatis.yml

mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto

other.yml

spring:
  application:
    name: gulimall-coupon
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.11.1:8848
server:
  port: 7000

GateWay网关

发送请求需要知道商品服务的地址,如果商品服务器有100服务器,1号掉线后,
还得改,所以需要网关动态地管理,他能从注册中心中实时地感知某个服务上
线还是下线。

请求也要加上询问权限,看用户有没有权限访问这个请求,也需要网关。

所以我们使用spring cloud的gateway组件做网关功能。

网关是请求浏览的入口,常用功能包括路由转发,权限校验,限流控制等。springcloud gateway取到了zuul网关。

三大核心概念:

Route: 发一个请求给网关,网关要将请求路由到指定的服务。路由有id,目的地uri,断言的集合,匹配了断言就能到达指定位置

Predicate断言: 就是java里的断言函数,匹配请求里的任何信息,包括请求头等

Filter: 过滤器请求和响应都可以被修改。客户端发请求给服务端。中间有网关。先交给映射器,如果能处理就交给handler处理,然后交给一系列filer,然后给指定的服务,再返回回来给客户端。

image-20220118150457863

image-20220118150649438

创建模块gulimall-gateway

image-20220118151954810

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aT7KGhDi-1686927502689)()]

pom文件,注意gateway可能会和spring-boot-starter-web依赖产生冲突,只需要在继承common依赖时排除spring-boot-starter-web依赖即可

<?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.2.11.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>Hoxton.SR9</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.wskh.gulimall</groupId>
            <artifactId>gulimall_common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <exclusions>
                <!--排除spring-boot-starter-web依赖-->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.2.0.RELEASE</version>
        </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>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZU5rBcuO-1686927502689)()]

在nacos中,为网关新建一个命名空间

image-20220125214118042

在配置列表中,找到gateway,在其中添加配置

image-20220125214253745

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llPoNLde-1686927502689)()]

新建文件bootstrap.properties(优先级高于application.properties)

spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=7804a6cd-a05f-4f8e-b44a-e54b511d09fe

application.yaml

spring:
  cloud:
    gateway:
      routes:
      - id: baidu_route
        uri: http://www.baidu.com
        predicates:
            - Query=url,baidu

      - id: test_route
        uri: http://www.qq.com
        predicates:
            - Query=url,qq

网关路由分发解释

例如现在有如下的路由分发机制

      - id: third_party_route
        uri: lb://gulimall-third-party
        predicates:
          - Path=/api/thirdparty/**
        filters:
          - RewritePath=/api/thirdparty/(?<segment>/?.*),/$\{segment}

其代表着:

  • uri的含义:会在nacos中找到名为gulimall-third-party的服务,将当前请求端口改为gulimall-third-party服务的端口作为要转发的地址
  • predicates-Path的含义:如果请求路径是符合/api/thirdparty/**形式的,那么就允许转发到uri指定的地址
  • filters-RewritePath的含义:对请求路径进行重写,重写规则是,只取/api/thirdparty/后面的内容,相当于在原请求的基础上截取掉了/api/thirdparty/这一段
Logo

更多推荐