spring cloud 入门

学习目标:

学习spring cloud项目快速搭建方法,学习nacos注册中心使用,实现两个服务间的调用

学习内容:

一、Spring Cloud介绍

在这里插入图片描述

  • Spring 以 Bean(对象) 为中心,提供 IOC、AOP 等功能。
  • Spring Boot 以 Application(应用) 为中心,提供自动配置、监控等功能。
  • Spring Cloud 以 Service(服务) 为中心,提供服务的注册与发现、服务的调用与负载均衡等功能。

Spring Cloud 官方对自己的简短介绍:基于 Spring 构建分布式系统的工具集,简称“Spring 全家桶”。
Spring Cloud 官方对功能点的介绍:
【配置中心】Distributed/versioned configuration
【注册中心】Service registration and discovery
【API 网关】Routing
【服务调用】Service-to-service calls
【负载均衡】Load balancing
【服务容错】Circuit Breakers
【分布式消息】Distributed messaging
SpringCloudAlibaba介绍:Spring Cloud 是分布式微服务架构的一站式解决方案,它提供了一套简单易用的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务系统的构建。 Spring Cloud 提供以微服务为核心的分布式系统构建标准。
在这里插入图片描述
Spring Cloud 提供了非常强大的功能,但是它并不提供所有的实现,而是通过 Spring Cloud Common 子项目,定义了统一的抽象 API。而后,不同厂商结合其自身的中间件,提供自己的 Spring Cloud 套件,Spring Cloud 官方、Netflix、Alibaba 三者整理成如下表格
在这里插入图片描述

二、Spring Cloud项目快速搭建

2.1技术选型

SpringCloud版本与SpringBoot对应关系:Spring Cloud 官方
在这里插入图片描述
SpringCloudAlibaba对应关系:版本发布说明 | Spring Cloud Alibaba
在这里插入图片描述
由于主机jdk安装的是1.8因此选用如下技术栈:
基础版本:
<spring.boot.version>2.6.13</spring.boot.version>
<spring.cloud.version>2021.0.5</spring.cloud.version>
<spring.cloud.alibaba.version>2021.0.5.0</spring.cloud.alibaba.version>
技术选型:
注册中心:spring-cloud-starter-alibaba-nacos-discovery
配置中心:spring-cloud-starter-alibaba-nacos-config
服务调用:spring-cloud-starter-openfeign
负载均衡:spring-cloud-loadbalancer
API网关:spring-cloud-starter-gateway

2.2创建SpringCloud父工程

2.2.1 创建maven工程

在这里插入图片描述

2.2.2 修改pom文件,指定依赖版本
<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><groupId>org.example</groupId><artifactId>cloudDemo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>gatewey</module><module>feignconsumer</module><module>feignprovide</module></modules><name>cloudDemo Maven Webapp</name><url>http://maven.apache.org</url><!-- 统一管理jar包版本 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.boot.version>2.6.13</spring.boot.version><spring.cloud.version>2021.0.5</spring.cloud.version><spring.cloud.alibaba.version>2021.0.5.0</spring.cloud.alibaba.version><lombok.version>1.18.28</lombok.version></properties><!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring.boot.version}</version><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>

2.3创建网关demo

2.3.1 网关的功能

性能:API高可用,负载均衡,容错机制。
安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
缓存:数据缓存。
监控:记录请求响应数据,api耗时分析,性能监控。
限流:流量控制,错峰流控,可以定义多种限流规则。
灰度:线上灰度部署,可以减小风险。
路由:动态路由规则

2.3.2 新建gateway子模块

1、创建maven项目,修改pom.xml文件

<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"><parent><artifactId>cloudDemo</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>gatewey</artifactId><packaging>war</packaging><name>gatewey Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><exclusions><!-- 排除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-bootstrap</artifactId></dependency><!-- nacos 客户端 作为 注册与发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- nacos 配置中心 --><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-loadbalancer</artifactId></dependency></dependencies><build><finalName>gatewey</finalName></build>
</project>

2、添加启动类GatewayApplication.java

package cloud.demo.gateway;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;/*** @ClassName GatewayApplication* @Description TODO* @Author c_see* @Date 2024/2/29 11:22* @Version 1.0**/
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan(basePackages = {"cloud.demo"})
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);System.out.println("网关启动成功");}
}

3、添加配置文件application.yaml

server:port: 8081
spring:profiles:active: devapplication:name: gateway-democloud:gateway:discovery:locator:# 是否与服务发现组件进行结合,通过 serviceId 转发到具体的服务实例。默认为falseenabled: truelower-case-service-id: true #使用小写service-idnacos:username: nacospassword: nacosconfig:server-addr: 127.0.0.1:8848namespace: publicdiscovery:server-addr: 127.0.0.1:8848namespace: publicconfig:import:- optional:nacos:gateway-demo.yml?refreshEnabled=true

4、在nacos中添加配置gateway-demo.yml,配置动态路由


spring:cloud:gateway:routes: # 网关路由配置# 路由id,自定义,只要唯一即可- id: feignconsumer # 目标服务地址(uri:地址,请求转发后的地址)# uri: http://127.0.0.1:8081 路由的目标地址http 就是固定地址,uri的协议为lb,表示启用Gateway的负载均衡功能。# 路由的目标地址lb就是负载均衡,后面跟服务名称uri: lb://feign-consumer# 路由断言,也就是判断请求是否符合路由规则的条件;转发地址格式uri/archivepredicates: # 这个是按照路径匹配,只要以 /user/ 开头就符合要求- Path=/user/** #fitters:#  - RewritePath=/user/?(?<segment>.*),/$\{segment}- id: feignprovideuri: lb://feign-providepredicates:- Path=/provide/**# 在这个时间之后的请求才会被转发#- After=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

2.4 创建服务提供者

1、创建feign-provide子模块,修改pom.xml
<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"><parent><artifactId>cloudDemo</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feignprovide</artifactId><packaging>war</packaging><name>feignprovide Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- feign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency></dependencies><build><finalName>feignprovide</finalName></build>
</project>
2.创建启动类ProvideApplication
package cloud.demo.provide;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @ClassName ProvideApplication* @Description TODO* @Author c_see* @Date 2024/2/29 14:28* @Version 1.0**/
@EnableDiscoveryClient
@SpringBootApplication
public class ProvideApplication {public static void main(String[] args) {SpringApplication.run(ProvideApplication.class, args);System.out.println("ProvideApplication 启动成功");}
}
3.创建配置文件application.yaml
server:port: 8082
spring:profiles:active: devapplication:name: feign-providecloud:nacos:username: nacospassword: nacosconfig:server-addr: 127.0.0.1:8848namespace: publicdiscovery:server-addr: 127.0.0.1:8848namespace: public
4、创建测试接口类UserProvideController
package cloud.demo.provide.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("user")
public class UserProvideController {@Value("${server.port}")private String port;/*** 通过用户ID获取用户* @param userId* @return*/@GetMapping("/getUser/{userId}")public String getUser(@PathVariable("userId") String userId){return String.format("【%s-服务提供者】:%s", port, userId);}}

2.5 创建消费者子模块

1.创建feign-consumer子模块,修改pom.xml
<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"><parent><artifactId>cloudDemo</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feignconsumer</artifactId><packaging>war</packaging><name>feignconsumer Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- feign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency></dependencies><build><finalName>feignconsumer</finalName></build>
</project>
2. 创建feign客户端UserClient
package cloud.demo.consumer.client;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;/*** 有关消费者client,配置需要调用服务者的名字*/
@FeignClient(name = "feign-provide") //对应的要调用提供者服务名spring.application.name
public interface UserClient {/*** 通过用户id获取用户* @param userId* @return*/@GetMapping("/user/getUser/{userId}")//对应要调用提供者的controllerString getUser(@PathVariable("userId") String userId);
}
3.创建启动类ConsumerApplication
package cloud.demo.consumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** @ClassName ConsumerApplication* @Description TODO* @Author c_see* @Date 2024/2/29 14:10* @Version 1.0**/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "cloud.demo.consumer.client")
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);System.out.println("ConsumerApplication 启动成功");}
}
4.创建配置文件application.yaml
server:port: 8083
spring:profiles:active: devapplication:name: feign-consumercloud:nacos:username: nacospassword: nacosconfig:server-addr: 127.0.0.1:8848file-extension: ymldiscovery:server-addr: 127.0.0.1:8848
4.创建测试接口类FeignConsumerController
package cloud.demo.consumer.controller;import cloud.demo.consumer.client.UserClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** 平台controller业务逻辑,引入client出发消费者调用提供者*/
@RestController
@RequestMapping("user")
public class FeignConsumerController {@Value("${server.port}")private String port;@Resourceprivate UserClient userClient;/*** 通过用户ID获取用户* @param userId* @return*/@GetMapping("/getUserInfo/{userId}")public String getUserInfo(@PathVariable("userId") String userId){String user = userClient.getUser(userId);return String.format("【%s-Demo消费者】:调用Feign接口返回值 %s", port, user);}}
2.5 测试结果

1、启动gateway、feign-provide、feign-consumer 3个模块,启动成功后在nacos可以看到服务注册成功
在这里插入图片描述
2、测试服务间调用
在这里插入图片描述
3、测试通过网关调用微服务
在这里插入图片描述

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

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

相关文章

【PyTorch][chapter 18][李宏毅深度学习]【无监督学习][ VAE]

前言: VAE——Variational Auto-Encoder&#xff0c;变分自编码器&#xff0c;是由 Kingma 等人于 2014 年提出的基于变分贝叶斯&#xff08;Variational Bayes&#xff0c;VB&#xff09;推断的生成式网络结构。与传统的自编码器通过数值的方式描述潜在空间不同&#xff0c;它…

Autosar-诊断配置详解-2

4创建、配置DcM模块 4.1导入DBC文件 按下图的操作步骤导入DBC文件: 导入后可以看到工具生成了3条DcM的Pdu,如下图: 4.2生成通信模块 点击AutoConfig让工具根据Dbc导入的信息生成通信相关的模块: 因为DBC文件中有Dcm的Pdu,因此工具还自动生成了Dcm模块,只是该模块是空…

kafka架构详解

文章目录 概述kafaka架构Kafka的设计时什么样的Zookeeper 在 Kafka 中的作用 概述 Apache Kafka 是分布式发布 - 订阅消息系统&#xff0c;在 kafka 官网上对 kafka 的定义&#xff1a;一个分布式发布 - 订阅消息传递系统。 Kafka 最初由 LinkedIn 公司开发&#xff0c;Linked…

el-input组件当数据为空时, 边框变红,并提示错误信息

1&#xff0c;样式 初始&#xff1a; 当不输入口令&#xff0c; 点击确定时&#xff1a; 2, 思路 主要是使用动态类的方式。 先设置输入框变红的样式以及提示文字的样式class 对于样式class 用变量来控制是否奏效。 3&#xff0c; 代码实现 //html&#xff1a; <div cl…

hippy 调试demo运行联调-mac环境准备篇

适用对于终端编译环境不熟悉的人看&#xff0c;仅mac端 hippy 调试文档官网地址 前提&#xff1a;请使用node16 联调预览效果图&#xff1a; 编译iOS Demo环境准备 未跑通&#xff0c;待补充 编译Android Demo环境准备 1、正常安装Android Studio 2、下载Android NDK&a…

航拍无人机技术,航拍无人机方案详解,无人机摄影技术

航拍无人机是利用遥控技术和摄像设备&#xff0c;在空中进行拍摄和录像的无人机。这种无人机通常具有高清摄像设备、图像传输设备、GPS定位系统、智能控制系统等&#xff0c;可以轻松实现各种拍摄角度和高度&#xff0c;广泛应用于影视制作、旅游景区航拍、城市规划、环保监测等…

深入理解c指针(六)

目录 九、函数指针数组 1、字符指针变量 2、数组指针变量 3、二维数组传参的本质 4、函数指针变量 4.1 分析《C陷阱和缺陷》中的两端代码 4.2 typedef关键字 5、函数指针数组 6、函数指针数组的用途---转移表 九、函数指针数组 1、字符指针变量 在指针的类型中我们知道…

软考52-上午题-【数据库】-关系模式2

一、关系模式的回顾 见&#xff1a;软考38-上午题-【数据库】-关系模式 二、关系模式 2-1、关系模式的定义 示例&#xff1a; 念法&#xff1a;A——>B A决定B&#xff0c;或者&#xff0c;B依赖于A。 2-2、函数依赖 1、非平凡的函数依赖 如果X——>Y&#xff0c;&a…

AI技术在室内定位的应用

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经逐渐渗透到我们生活的方方面面。其中&#xff0c;AI技术在室内定位领域的应用越来越广泛&#xff0c;为我们的生活和工作带来了诸多便利。本文将深入探讨AI技术在室内定位领域的应用&#xff0c;并分…

基于springboot+vue的美食推荐商城

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

万字带你走过数据库的这激荡的三年

本文收集了卡内基梅隆大学计算机科学系数据库学副教授 Andy Pavlo 从 2021 到 2023 连续三年对数据库领域的回顾&#xff0c;希望通过连续三年的回顾让你对数据库领域的技术发展有所了解。 关于 Andy Pavlo&#xff1a;卡内基梅隆大学计算机科学系数据库学副教授&#xff0c;数…

C++ Python网易云音乐播放器

程序示例精选 网易云音乐播放器 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《网易云音乐播放器》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。…