03-微服务搭建

1、搭建分布式基本环境

分布式组件

功能

SpringCloud Alibaba - Nacos

注册中心(服务发现/注册)、配置中心(动态配置管理)

SpringCloud Alibaba - Sentinel

服务容错(限流、降级、熔断)

SpringCloud Alibaba - Seata

原 Fescar,即分布式事务解决方案

SpringCloud - Ribbon

负载均衡

SpringCloud - Feign

声明式 HTTP 客户端(调用远程服务)

SpringCloud - Sleuth

调用链监控

SpringCloud - Gateway

API 网关(webflux 编程模式)

引入微服务依赖

在 common 模块中引入 springcloud-alibaba 版本依赖

<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>

下载启动 nacos:Releases · alibaba/nacos · GitHub,双击 nacos\bin\startup.cmd

每个微服务应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

每个服务的启动类上添加 @EnableDiscoveryClient 注解开启服务注册与发现功能

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

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

    @RestController
    class EchoController {
        @GetMapping(value = "/echo/{string}")
        public String echo(@PathVariable String string) {
            return string;
        }
    }
}

配置每个服务名称

spring.application.name=gulimall-coupon

启动服务,在 nacos 中查看是否注册成功

OpenFeign 远程调用

每个服务引入 openfeign 依赖

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

声明远程调用服务接口:在 member 服务中定义此接口(member 服务调用 coupon 服务),将所有的远程调用接口都放在 feign 包里面。

@FeignClient("gulimail-coupon")
public interface CouponFeignService {
    
    @RequestMapping("coupon/coupon/member/list")
    public R memberCoupons();
}

调用方服务(member)开启远程调用注解:@EnableFeignClients

@EnableFeignClients(basePackages = "com.atguigu.gulimail.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {

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

}

member 服务远程调用 coupon 服务

@Autowired
CouponFeignService couponFeignService;

@RequestMapping("/coupons")
public R test() {
    // 定义一个会员
    MemberEntity memberEntity = new MemberEntity();
    memberEntity.setNickname("龙傲天");
    
    // 远程调用copuon服务获取此会员的优惠卷
    R memberCoupons = couponFeignService.memberCoupons();
    return R.ok().put("member", memberEntity).put("coupons", memberCoupons.get("coupons"));
}

coupon 服务获取优惠卷列表

/*
* 返回当前会员的所有优惠卷
* */
@RequestMapping("/member/list")
public R memeberCoupons() {
    CouponEntity couponEntity = new CouponEntity();
    couponEntity.setCouponName("满100减50...");
    return R.ok().put("coupons", Arrays.asList(couponEntity));
}

访问接口 http://localhost:8000/member/member/coupons 测试远程调用

注意:可以访问成功的前提是,服务提前注册到了nacos中


Nacos 配置中心
原始读取配置方式

如下是没有使用Nacos作为配置中心之前,读取配置文件的方式:

第一步:在配置文件中定义变量信息

coupon.user.name=AotianLong
coupon.user.age=18

第二步:将配置文件中的配置读取到类的变量中

@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);
}

引入配置中心

需求:原始读取配置方式,程序打包部署后不能动态更改信息,此时就需要引入配置中心了

在common模块引入 nacos 配置依赖和bootstrap依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>3.1.2</version>
</dependency>

在每个服务应用中创建 /src/main/resources/bootstrap.properties 配置文件

# 微服务名称
spring.application.name=gulimall-coupon

# 配置中心 Nacos 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

在nacos控制台创建项目的配置如文件,编写配置信息:如,gulimall-coupon.properties

在需要读取配置中心数据的类上添加@RefreshScope注解,在变量上添加 @Value注解

// 动态刷新
@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);
    }
}

注意:如果配置中心 和 微服务项目里面的配置文件同时存在相同的配置信息,那么会优先读取配置中心中的信息。


配置中心概念

命名空间:

利用命名空间做环境隔离(默认空间是 public):开发、测试、生产。

在bootstrap.properties配置文件中指定命名空间。


spring.cloud.nacos.config.namespace=e0ed0744-32c5-4f41-8ace-09b1391fc4a1

基于微服务进行隔离:给每个服务创建自己的命名空间,服务在启动的时候只需要加载自己命名空间下的配置文件。

② 配置集:所有配置的集合;配置集ID:Data ID 类似文件名

配置分组:默认所有的配置集都属于 DEFAULT_GROUP,可以配置配置分组

# 在bootstrap.properties 配置文件中指定配置分组。
spring.cloud.nacos.config.group=dev

每个微服务创建自己的命名空间,使用配置分组区分环境(开发、测试、生产…)


拆分配置

需求:同时加载多个配置集,不同组件的配置不会写在同一个配置文件中如:数据源、框架、微服务

配置文件按功能拆分:如spring拆分成一个,mybatis拆分成一个、其他配置再拆分成一个

在bootstrap.properties 配置文件中加载配置信息

spring.cloud.nacos.config.namespace=42917e19-6cbd-4478-89a1-3e36d5d16df5
spring.cloud.nacos.config.group=dev

spring.cloud.nacos.config.ext-config[0].data-id=datasource.yaml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

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=others.yaml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true


Gateway 网关

网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。

网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。

核心概念

解释

路由

路由是网关最基础的部分,路由信息有一个 ID、一个目的 URL、一组断言和一组 Filter 组成。如果断言路由为真,则说明请求的 URL 和配置匹配

断言

Java8 中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是 Spring5.0 框架中的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 http request 中的任何信息,比如请求头和参数等。

过滤器

一个标准的 Spring webFilter。Spring cloud gateway 中的 filter 分为两种类型的Filter,分别是 Gateway Filter 和 Global Filter。过滤器 Filter 将会对请求和响应进行修改处理。

创建 gateway 服务,引入gulimail-common依赖

<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>网关服务</description>

<properties>
  <java.version>1.8</java.version>
  <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway-mvc</artifactId>
  </dependency>
  <!--        引入common依赖(注册中心、配置中心)-->
  <dependency>
    <groupId>com.atguigu.gulimall</groupId>
    <artifactId>gulimall-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </dependency>
</dependencies>

开启服务注册发现:@EnableDiscoveryClient ,并排除数据源的配置

@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GulimallGatewayApplication {

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

}

配置 Nacos 服务地址、服务名和端口:application.properties

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

配置Naocs配置中心地址、并指定命名空间:bootstrap.properties

spring.cloud.nacos.config.namespace=84f86833-fca4-4ee9-9ffd-fbb65ccaebfb

测试网关服务:在application.yaml 文件中编写路由规则后启动服务

spring:
  cloud:
    gateway:
      routes:
        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url,qq

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

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

相关文章

Vue前端开发2.3.2-4 绑定指令

本文介绍了Vue中的绑定指令&#xff0c;包括属性绑定指令v-bind、事件绑定指令v-on以及双向数据绑定指令v-model。通过创建单文件组件&#xff0c;演示了如何使用这些指令来控制DOM属性、监听事件和实现表单输入与数据的双向同步。同时&#xff0c;探讨了v-model的修饰符如.num…

uniapp开发支付宝小程序自定义tabbar样式异常

解决方案&#xff1a; 这个问题应该是支付宝基础库的问题&#xff0c;除了依赖于官方更新之外&#xff0c;开发者可以利用《自定义 tabBar》曲线救国 也就是创建一个空内容的自定义tabBar&#xff0c;这样即使 tabBar 被渲染出来&#xff0c;但从视觉上也不会有问题 1.官方文…

双向链表、循环链表、栈

双向循环链表 class Node:#显性定义出构造函数def __init__(self,data):self.data data #普通节点的数据域self.next None #保存下一个节点的链接域self.prior None #保存前一个节点饿链接域 class DoubleLinkLoop:def __init__(self, node Node):self.head nodeself.siz…

【大数据学习 | Spark-Core】RDD的缓存(cache and checkpoint)

1. 单应用缓存&#xff1a;cache 1.1 cache算子 cache算子能够缓存中间结果数据到各个executor中&#xff0c;后续的任务如果需要这部分数据就可以直接使用避免大量的重复执行和运算。 rdd 存储级别中默认使用的算子cache算子&#xff0c;cache算子的底层调用的是persist算子…

上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量

在当今快速发展的物联网市场中&#xff0c;无线连接技术的不断进步对智能设备的性能和能效提出了更高要求。为了满足这一需求&#xff0c;乐鑫科技推出了ESP32-C61——一款高性价比的Wi-Fi 6芯片&#xff0c;旨在为用户设备提供更出色的物联网性能&#xff0c;并满足智能设备连…

如何选择黑白相机和彩色相机

我们在选择成像解决方案时黑白相机很容易被忽略&#xff0c;因为许多新相机提供鲜艳的颜色&#xff0c;鲜明的对比度和改进的弱光性能。然而&#xff0c;有许多应用&#xff0c;选择黑白相机将是更好的选择&#xff0c;因为他们产生更清晰的图像&#xff0c;更好的分辨率&#…

ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页

一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…

MVC、EL、JSTL

1.MVC设计模式 三层&#xff1a; MVC&#xff1a; M&#xff08;Model&#xff09;模型&#xff1a;负责业务逻辑处理&#xff0c;数据库访问。 V&#xff08;View&#xff09;视图&#xff1a;负责与用户交互。 C&#xff08;Controller&#xff09;控制器&#xff1a;负责流程…

Python的3D可视化库 - vedo (3)visual子模块 点对象的可视化控制

文章目录 3 PointsVisual的方法3.1 对象属性3.1.1 顶点大小3.1.2 复制属性3.1.3 颜色设置3.1.4透明度设置 3.2 对象光效3.2.1 点的形状3.2.2 点的表面光效 3.3 尾随线和投影3.3.1 尾随线3.3.2 投影 3.4 给对象附加文字说明3.4.1 标注3.4.2 2D标注3.4.3 气泡说明3.4.4 旗标说明3…

MySQL系列之远程管理(安全)

导览 前言Q&#xff1a;如何保障远程登录安全一、远程登录的主要方式1. 用户名/口令2. SSH3. SSL/TLS 二、使用TLS协议加密连接1. 服务端2. 客户端 结语精彩回放 前言 在我们的学习或工作过程中&#xff0c;作为开发、测试或运维人员&#xff0c;经常会通过各类客户端软件&…

交通路口智能监测平台实现

目录 本文所有资源均可在该(https://www.aspiringcode.com/content?id17218996189491&uid3e852f876bcd45a4b3e8cf241260451b)处获取。 1.概述 交通要道的路口上人车穿行&#xff0c;特别是上下班早高峰&#xff0c;且时常发生交通事故。因此对交通路口的车流量和人流量的…

Qt Graphics View 绘图架构

Qt Graphics View 绘图架构 "QWGraphicsView.h" 头文件代码如下&#xff1a; #pragma once#include <QGraphicsView>class QWGraphicsView : public QGraphicsView {Q_OBJECTpublic:QWGraphicsView(QWidget *parent);~QWGraphicsView();protected:void mouseM…

获 2023 年度浙江省科学技术进步奖一等奖 | 网易数智日报

11 月 22 日&#xff0c;加快建设创新浙江因地制宜发展新质生产力动员部署会暨全省科学技术奖励大会在杭州隆重召开。浙江大学、网易数智等单位联合研发的“大规模结构化数据智能计算平台及产业化”项目获得 2023 年度浙江省科学技术进步奖一等奖。 加快建设创新浙江因地制宜发…

C++笔记之构造函数声明只需要写明需要的参数,不需要列出所有成员变量、可以使用成员初始化列表初始化所有需要的成员变量

C++笔记之构造函数声明只需要写明需要的参数,不需要列出所有成员变量、可以使用成员初始化列表初始化所有需要的成员变量 参考笔记 C++新特性探究(七):初始化列表(Initialization List) C++之关于初始化列表(Initialization List)的一个补充示例 C++笔记之构造函数声明只需要…

Element UI 打包探索【1】

目录 第一个命令 第二个命令 node build/bin/iconInit.js node build/bin/build-entry.js node build/bin/i18n.js node build/bin/version.js 总结 最近在接触组件库的项目&#xff0c;所以特意拿来Element UI借鉴学习一下&#xff0c;它算是做前端的同学们离不开的一…

使用Setup Factory将C#的程序打包成安装包

一、软件下载 https://download.csdn.net/download/qq_65356682/90042701 可以直接下载 二、软件使用 打开 1、创建一个新的项目 2、设置如下信息&#xff0c;也可以不设置&#xff0c;最好填非空的、 产品名就是你安装成功后生成文件的名称 3、如下文件夹路径就是你C#中ex…

QT实现拷贝复制文件操作 QT5.12.3环境 C++实现

案例需求&#xff1a;利用QT线程操作&#xff0c;实现拷贝复制文件操作 代码&#xff1a; myfile.h #ifndef MYFILE_H #define MYFILE_H#include <QObject> #include <QDebug> #include <QThread> #include <QFile> #include <QtWidgets> class…

vue 富文本图片如何拖拽

在Vue项目中实现富文本编辑器&#xff08;如vue-quill-editor&#xff09;的图片拖拽功能&#xff0c;需要结合Quill.js及其相关插件进行配置 安装必要的依赖包&#xff1a; 你需要安装vue-quill-editor作为富文本编辑器的基础组件。为了支持图片拖拽功能&#xff0c;你还需要…

Python基础学习-11函数参数

1、"值传递” 和“引用传递” 1&#xff09;不可变的参数通过“值传递”。比如整数、字符串等 2&#xff09;可变的参数通过“引用参数”。比如列表、字典。 3&#xff09;避免可变参数的修改 4&#xff09;内存模型简介 2、函数参数类型 1&#xff09; def func() #无参…

41_GAN网络详解(1)

生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#xff09;是一种深度学习模型&#xff0c;提出于2014年&#xff0c;由Ian Goodfellow及其团队提出。GAN通过对抗训练的方式&#xff0c;利用两个神经网络模型进行协作&#xff0c;达到生成高质量…