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);}@RestControllerclass 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 {@Autowiredprivate 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=devspring.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=truespring.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=truespring.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_routeuri: https://www.qq.compredicates:- Query=url,qq

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

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

相关文章

Java八股(一)

目录 1.JVM、JRE、JDK之间的关系 2.static关键字作用&#xff08;通俗版&#xff09; 3.面向对象、面向过程 4.私有方法 5.Java代码执行与编译 6.IOC 1.JVM、JRE、JDK之间的关系 Java一次编写到处运行&#xff0c;可移植性好&#xff0c;保证这一点的就是iava虚拟机JVM …

Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

yum install 报错: Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 CentOS7的SCL源在2024年6月30日停止维护了。 当scl源里面默认使用了centos官方的地址&#xff0c;无法连接&#xff0c;需要替换为阿里云。 cd /etc/yum.repos.d/ 找到 CentOS-SCLo-scl.repo 和…

Vue前端开发-slot传参

slot 又称插槽&#xff0c;它是在子组件中为父组件提供的一个占位符&#xff0c;使用来表示&#xff0c;通过这个占位符&#xff0c;父组件可以向中填充任意的内容代码&#xff0c;这些代码将自动替换占位符的位置&#xff0c;从而轻松实现在父组件中控制子组件内容的需求。 作…

如何在 Ubuntu 22.04 上安装带有 Nginx 的 ELK Stack

今天我们来聊聊如何在 Ubuntu 22.04 服务器上安装 ELK Stack&#xff0c;并集成 Nginx 作为 Web 服务器&#xff0c;同时使用 Let’s Encrypt Certbot 进行 SSL 认证。ELK Stack&#xff0c;包括 Elasticsearch、Logstash 和 Kibana&#xff0c;是一套强大的工具&#xff0c;用…

快速理解微服务中Sentinel怎么实现限流

Sentinel是通过动态管理限流规则&#xff0c;根据定义的规则对请求进行限流控制。 一.实现步骤 1.定义资源&#xff1a;在Sentinel中&#xff0c;资源可以是URL、方法等&#xff0c;用于标识需要进行限流的请求&#xff1b;(在Sentinel中&#xff0c;需要我们去告诉Sentinel哪些…

基于单片机的智慧小区人脸识别门禁系统

本设计基于单片机的智慧小区人脸识别门禁系统。由STM32F103C8T6单片机核心板、显示模块、摄像头模块、舵机模块、按键模块和电源模块组成。可以通过摄像头模块对进入人员人脸数据进行采集&#xff0c;识别成功后&#xff0c;舵机模块动作&#xff0c;模拟门禁打开&#xff0c;门…

llama-factory 系列教程 (七),Qwen2.5-7B-Instruct 模型微调与vllm部署详细流程实战

文章目录 介绍llama-factory 安装装包下载模型 微调模型数据集训练模型 微调后的模型推理 介绍 时隔已久的 llama-factory 系列教程更新了。本篇文章是第七篇&#xff0c;之前的六篇&#xff0c;大家酌情选看即可。 因为llama-factory进行了更新&#xff0c;我前面几篇文章的实…

利用Docker容器技术部署发布web应用程序

Docker是什么&#xff1f; docker 是一个开源的应用容器引擎&#xff0c;可以帮助开发者打包应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化&#xff0c;容器是完全使用沙箱机制&#xff0c;相互之间不会有任何…

SpringCloud框架学习(第五部分:SpringCloud Alibaba入门和 nacos)

目录 十二、SpringCloud Alibaba入门简介 1. 基本介绍 2.作用 3.版本选型 十三、 SpringCloud Alibaba Nacos服务注册和配置中心 1.简介 2.各种注册中心比较 3.下载安装 4.Nacos Discovery服务注册中心 &#xff08;1&#xff09; 基于 Nacos 的服务提供者 &#xf…

Linux—进程概念学习-03

目录 Linux—进程学习—31.进程优先级1.1Linux中的进程优先级1.2修改进程优先级—top 2.进程的其他概念3.进程切换4.环境变量4.0环境变量的理解4.1环境变量的基本概念4.2添加环境变量—export4.3Linux中环境变量的由来4.4常见环境变量4.5和环境变量相关的命令4.6通过系统调用获…

信创改造 - TongRDS 替换 Redis

记得开放 6379 端口哦 1&#xff09;首先在服务器上安装好 TongRDS 2&#xff09;替换 redis 的 host&#xff0c;post&#xff0c;passwd 3&#xff09;TongRDS 兼容 jedis # 例如&#xff1a;更改原先 redis 中对应的 host&#xff0c;post&#xff0c;passwd 改成 TongRDS…

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序&#xff0c;用于从网站抓取数据。Python 凭借其丰富的库和简单的语法&#xff0c;是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识&#xff0c;并实现一个简单的爬虫项目。 1. 什么是网络爬虫&#xff1f; 网络爬虫&#x…

从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)

本文不仅细化了每一个步骤&#xff0c;实现了从0到1部署Tomcat和添加servlet。还针对IDEA2024版和以前的版本在部署上的区别&#xff0c;做了详细介绍&#xff0c;尤其是add framework support部分。与此同时&#xff0c;针对控制台中文乱码问题&#xff0c;本文也给出了详细解…

书生大模型实战营第四期-入门岛-4. maas课程任务

书生大模型实战营第四期-入门岛-4. maas课程任务 任务一、模型下载 任务内容 使用Hugging Face平台、魔搭社区平台&#xff08;可选&#xff09;和魔乐社区平台&#xff08;可选&#xff09;下载文档中提到的模型&#xff08;至少需要下载config.json文件、model.safetensor…

相亲交友小程序项目介绍

一、项目背景 在当今快节奏的社会生活中&#xff0c;人们忙于工作和事业&#xff0c;社交圈子相对狭窄&#xff0c;寻找合适的恋爱对象变得愈发困难。相亲交友作为一种传统而有效的社交方式&#xff0c;在现代社会依然有着巨大的需求。我们的相亲交友项目旨在为广大单身人士提…

初级数据结构——二叉树题库(c++)

这里写目录标题 前言[1.——965. 单值二叉树](https://leetcode.cn/problems/univalued-binary-tree/)[2.——222. 完全二叉树的节点个数](https://leetcode.cn/problems/count-complete-tree-nodes/)[3.——144. 二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-…

【前端】ES6基础

1.开发工具 vscode地址 :https://code.visualstudio.com/download, 下载对应系统的版本windows一般都是64位的 安装可以自选目录&#xff0c;也可以使用默认目录 插件&#xff1a; 输入 Chinese&#xff0c;中文插件 安装&#xff1a; open in browser&#xff0c;直接右键文件…

25A物联网微型断路器 智慧空开1P 2P 3P 4P-安科瑞黄安南

微型断路器&#xff0c;作为现代电气系统中不可或缺的重要组件&#xff0c;在保障电路安全与稳定运行方面发挥着关键作用。从其工作原理来看&#xff0c;微型断路器通过感知电流的异常变化来迅速作出响应。当电路中的电流超过预设的安全阈值时&#xff0c;其内部的电磁感应装置…

数据结构--Map和Set

目录 一.二叉搜索树1.1 概念1.2 二叉搜索树的简单实现 二.Map2.1 概念2.2 Map常用方法2.3 Map使用注意点2.4 TreeMap和HashMap的区别2.5 HashMap底层知识点 三.Set3.1 概念3.2 Set常用方法3.3 Set使用注意点3.4 TreeSet与HashSet的区别 四.哈希表4.1 概念4.2 哈希冲突与避免4.3…

计算机操作系统——进程控制(Linux)

进程控制 进程创建fork&#xff08;&#xff09;函数fork() 的基本功能fork() 的基本语法fork() 的工作原理fork() 的典型使用示例fork() 的常见问题fork() 和 exec() 结合使用总结 进程终止与$进程终止的本质进程终止的情况正常退出&#xff08;Exit&#xff09;由于信号终止非…