【系统开发】尚硅谷 - 谷粒商城项目笔记(二):搭建分布式系统基本环境

news2024/11/24 20:34:49

文章目录

  • 搭建分布式系统基本环境
    • 引入spring-cloud-alibaba依赖
    • Nacos作为注册中心
    • Feign 远程调用
    • Nacos作为配置中心
    • Nacos配置中心进阶
    • Nacos加载多配置集
    • GateWay网关
    • 网关路由分发解释


搭建分布式系统基本环境

引入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/这一段

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Socket网络通信过程 与 IO多路复用原理

0、引言 本文主要讲述Socket网络编程的基本知识、IO多路复用的select、poll、epoll实现原理以及比较&#xff0c;并解答了一些socket建立连接、阻塞的常见问题。 1、什么是Socket、网络通信的过程 Socket 的中文名叫作插口&#xff0c;事实上&#xff0c;双方要进行网络通信前…

HTML(一)

一.HTML的标准结构 <!doctype html> 声明文档类型<html> HTML根标签<head> 头标签<title></title> 标题标签</head><body> 主题标签...</body></html> 二.标签介绍 2.1 段落标签 1.注释标签 <!--我是一个注释--…

送外卖适合什么蓝牙耳机,推荐几款适合户外佩戴的骨传导耳机

骨传导耳机&#xff0c;是通过震动的方式将声音转化为不同频率的机械振动&#xff0c;由于不需要通过耳膜就可以听到声音&#xff0c;骨传导耳机在保留传统耳机的优点的基础上&#xff0c;解决了传统耳机不能在开放环境中使用的问题。那么在骨传导耳机中&#xff0c;究竟有哪些…

MobaXterm 常用设置

MobaXterm 是用于远程计算的工具箱&#xff0c;作为一个 Windows 应用程序&#xff0c;它为程序员、网站管理员、IT管理员和几乎所有需要以更简单的方式处理远程工作的用户量身定制了大量功能。MobaXterm 提供了所有重要的远程网络工具(SSH, X11, RDP, VNC, FTP, MOSH&#xff…

消息队列常见问题整理

前言 消息队列&#xff08;Message Queue&#xff09;&#xff0c;从广义上讲是一种消息队列服务中间件&#xff0c;提供一套完整的信息生产、传递、消费的软件系统。 消息队列所涵盖的功能远不止于队列&#xff08;Queue&#xff09;&#xff0c;其本质是两个进程传递信息的…

Java Web程序设计的学习

属于B/S结构、服务器软件&#xff1a;Apache Tomcat、 Web 项目 目录结构&#xff1a; 1.src目录&#xff1a;存放Java源文件 2.WebRoot目录&#xff1a; 存在两个子目录&#xff1a; META-INF目录 WEB-INF目录&#xff1a;&#xff08;lib目录&#xff1a;存放驱动…

Notepad++安装json插件

Notepad是Windows操作系统下的一套文本编辑器(软件版权许可证:GPL)&#xff0c;有完整的中文化接口及支持多国语言编写的功能(UTF8技术)。 Notepad功能比 Windows 中的Notepad(记事本)强大&#xff0c;除了可以用来制作一般的纯文字说明文件&#xff0c;也十分适合编写计算机程…

MySQL数据表:对数据的基础操作(增、删、查、改)以及运算符的讲解

目录 前言 一.增加数据 二.查询数据 2.1查询数据表中所有信息 2.2查询表中指定的列信息 2.3查询通过计算的列 2.4使用别名代替列名 2.5查询不带有重复值的列 2.6将查询的结果进行排序 2.7条件查询 2.7.1条件查询的种类 2.7.2使用运算符查询的讲解 2.8分页查询 …

2015年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2015年1月真题&#xff1a; 四、写作&#xff1a;第56~57小题&#xff0c;共65 分。其中论证有效性分析30 分&#xff0c;论说文35 分。 56、论证有效性分析&#xff1a; 分析下述论证存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600 字的文章&#xff0c;对…

MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)

一&#xff0c;MyCat入门 1.什么是mycat 官网&#xff1a;http://www.mycat.org.cn/​ mycat是数据库中间件 它可以干什么&#xff1f; 读写分离数据分片&#xff1a;垂直拆分&#xff0c;水平拆分多数据源整合 2.数据库中间件 ​ 中间件&#xff1a;是一类连接软件组件和…

KSM01.2B-061C-35N-M1-HP0-SE-NN伺服电机力士乐

​ KSM01.2B-061C-35N-M1-HP0-SE-NN伺服电机力士乐 KSM01.2B-061C-35N-M1-HP0-SE-NN伺服电机力士乐 从应用对象的规模上来说&#xff1a; PLC一般应用在小型自控场所&#xff0c;比如设备的控制或少量的模拟量的控制及联锁&#xff0c;而大型的应用一般都是DCS。当然&#x…

STM32开发——DMA(数据搬运)

目录 1.DMA简介 2.从内存到内存搬运 2.1CubeMX设置 2.2函数代码 3.内存到外设 3.1CubeMX配置 3.2 函数代码 4.外设到内存 4.1CubeMX配置 4.1函数代码 1.DMA简介 DMA(Direct Memory Access&#xff0c;直接存储器访问) 提供在外设与内存、存储器和存储器、外设 与外设…

APM二次开发(二):添加一个任务

固件版本 APM copter 4.3.1 参考&#xff1a;https://ardupilot.org/dev/docs/code-overview-scheduling-your-new-code-to-run-intermittently.html APM添加任务比PX4要简单很多&#xff0c;直接在调度器里添加函数即可。 先定义一个要调度的函数my_test() 然后加到调度器中…

C++ [STL容器反向迭代器]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL容器反向迭代器 前言正文适配器反向迭代器反向迭代器框架默认成员函数反向迭代器的遍历反向迭代器的比较反向迭代器数据访问反向迭代器代码测试反向迭代器 最后 前言 我们知道STL大部分容器…

(2023最新版)互联网大厂1120道Java面试真题附答案详解

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#…

5.3.4 因特网的路由协议(四)BGP协议

5.3.4 因特网的路由协议&#xff08;四&#xff09;BGP协议 我们学习的RIP协议&#xff08;5.3.2 因特网的路由协议&#xff08;二&#xff09;基于距离向量算法的RIP协议&#xff09;和OSPF协议&#xff08;5.3.3 因特网的路由协议&#xff08;三&#xff09;OSPF协议&#x…

Python真的对初学者友好吗?其实可以从以下几点就能看出(收藏)

本文内容里我给大家分享的是一篇关于学习python有哪些必要条件&#xff0c;需要的朋友们可以学习下。 编程零基础&#xff0c;可以学习 Python 吗&#xff1f;这是很多初学者经常问我的一个问题。 当然&#xff0c;在计算机方面的基础越好&#xff0c;对学习任何一门新的编程…

强制使用本地GNSS作为时钟源带来的思考

1.背景知识 BMCA&#xff08;最佳时钟源选择算法&#xff09;&#xff1a;它是在PTP网络里面用来选择最佳时钟源的一种常见算法&#xff0c;它的执行过程包含一下四步&#xff1a; 时钟源发现&#xff1a;在网络中的PTP设备会交换时钟源信息。每个设备会公告自己的时钟源特性&…

联想拯救者电脑触摸板用不了了

文章目录 问题分析解决1. 解决方法一2. 解决方法二3. 解决方法三 问题 电脑触摸板用不了了&#xff0c;无论使用怎样的操作均未能完成对鼠标的操作 分析 这是因为被误触了“游戏模式”&#xff0c;就会出现“防误触”开关 解决 1. 解决方法一 &#xff08;开机输入密码前…

汽车EDI:如何与SAS建立 EDI 连接?

SAS Automotive Systems &#xff08;以下简称为&#xff1a;SAS&#xff09;是一家全球领先的汽车零部件制造商&#xff0c;总部位于德国。该公司专注于汽车电子技术和系统集成领域&#xff0c;为世界各大汽车制造商提供创新的解决方案。 EDI&#xff08;电子数据交换&#x…