一、SpringCloud简介

Spring Cloud 是⼀个基于SpringBoot实现的微服务架构应用开发框架,它为我们进行微服务架构应用开发提
供了服务注册与发现、熔断器、网关路由、配置管理、负载均衡、消息总线、数据监控等⼀系列工具。


Spring Cloud比较成熟的两个体系:

  • Spring Cloud Netflix
  • Spring Cloud Alibaba

Spring Cloud核心组件

  • Spring Cloud Netflix

    • Eureka 服务注册与发现中心,用于服务治理
    • Feign 服务访问组件(对Ribbon和HyStrix的封装)
    • Ribbon 服务访问组件、进行服务调用,实现了负载均衡(停更了)
    • Hystrix 熔断器,服务容错管理
    • zuul 网关组件
  • Spring Cloud Config 配置管理的组件—分布式配置中心
  • Spring Cloud Bus 消息总线
  • Spring Cloud Consul 服务注册与发现中心(功能类似eureka)

二、Eureka—服务注册与发现中心

Eureka—服务注册与发现中心:服务提供者将服务注册到这里,服务消费者在这里调用服务。
Eureka可靠性—可以实现Eureka集群,防止单个节点挂掉,Eureka集群搭建。
Eureka安全性—Spring Security安全框架,设置帐号和密码来限制服务的注册及发现。

服务提供者:以一个标准来划分的service服务。例如以对数据库进行一次操作就划分为一个服务。(是一个完整的springboot模块,可以理解为将单体项目中dao层对数据库的一个增删改查操作提取出来作为一个单独的springboot模块,整个项目只有这一个业务供别人调用)
服务消费者:提供面向前端的api接口,供前端访问(也是一个完整的springboot模块,调用一个或多个服务提供者模块来完成一整个大的操作业务功能,可以理解为单体项目中的controller中的一个业务)

2.1 添加依赖

太新的版本可能不好使 (下面的都好使)
springboot 2.5.9 2.4.4
spring-cloud 2021.0.0 2020.0.5

  • spring web
  • eureka server
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.2 配置服务注册与发现中心

## 设置服务注册与发现中⼼的端⼝
server:port: 8761
## 在微服务架构中,服务注册中⼼是通过服务应⽤的名称来区分每个服务的
## 我们在创建每个服务之后,指定当前服务的 应⽤名/项⽬名
spring:application:name: service-eureka
eureka:client:## 192.168.54.59这个ip如果是集群就填写要注册到别的eureka的ip地址,## 否则默认ip是本地localhost,端口号是8761service-url:defaultZone: http://192.168.54.59:8761/eureka## 设置服务注册与发现中⼼是否为为集群搭建(如果为集群模式,多个eureka节点之间需要相互注册)register-with-eureka: false## 设置服务注册与发现中是否作为服务进⾏注册fetch-registry: false

2.3 配置启动类

  • @EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class ServiceEurekaApplication {public static void main(String[] args) {SpringApplication.run(ServiceEurekaApplication.class, args);}
}

2.4 运行及访问

  • 访问 http://localhost:8761

三、Spring Security—安全框架

当完成Eureka的搭建之后,只要知道ip和port就可以随意的注册服务、调用服务,这是不安全的,我们可以
通过设置帐号和密码来限制服务的注册及发现。
在eureka中整合Spring Security安全框架实现帐号和密码验证

3.1 添加的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

3.2 配置文件

##  设置访问eureka的帐号和密码
spring:security:user:name: zhangsanpassword: 123456

3.3 添加配置类

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable();//设置当前服务器的所有请求都要使⽤spring security的认证http.authorizeRequests().anyRequest().authenticated().and().httpBasic();}
}

3.4 服务提供者和服务消费者连接到注册中心都要帐号和密码

## 服务提供者和服务消费者的eureka yml配置都要加账号密码才能访问到服务与注册中心
eureka:client:service-url:defaultZone: http://zhangsan:123456@localhost:8761/eureka

四、服务注册(服务提供者)

将能够完成特定业务的SpringBoot应用作为服务提供者,注册到服务注册与发现中心

4.1 添加的依赖

  • eureka-server
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

4.2 配置文件

## 当前服务的port
server:port: 9001
## 当前应⽤名会作为服务唯⼀标识注册到eureka
spring:application:name: order-adddatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db_2010_sc?characterEncoding=utf-8username: rootpassword: admin123
mybatis:mapper-locations: classpath:mappers/*type-aliases-package: com.qfedu.order.beans
## 配置Eureka服务注册与发现中⼼的地址
eureka:client:service-url:defaultZone: http://localhost:8761/eureka

4.3 配置启动类

  • @MapperScan(“com.qfedu.order.dao”)
  • @EnableEurekaClient
@SpringBootApplication
@MapperScan("com.qfedu.order.dao")
@EnableEurekaClient
public class OrderAddApplication {public static void main(String[] args) {SpringApplication.run(OrderAddApplication.class, args);}
}

五、服务发现(服务消费者)—Feign

Feign是基于Ribbon和Hystrix的封装

5.1 添加的依赖

  • spring web
  • eureka server
  • OpenFeign
  • hystrix
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.3.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

5.2 配置文件

server:port: 8002
spring:application:name: api-order-add-feign
eureka:client:service-url:defaultZone: http://localhost:8761/eureka
## 启⽤熔断器机制
## 老版本这么写
feign:hystrix:enabled: true
## 新版本
feign:circuitbreaker:enabled: true## 设置熔断器服务降级时间 (默认 1000)
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 8000

5.3 配置启动类

  • @EnableDiscoveryClient
  • @EnableFeignClients
  • @EnableHystrix
@SpringBootApplication
@EnableDiscoveryClient //声明为服务消费者
@EnableFeignClients //声明启⽤feign客户端
@EnableHystrix         //声明启⽤熔断器
public class ApiOrderAddFeignApplication {public static void main(String[] args) {SpringApplication.run(ApiOrderAddFeignApplication.class, args);}
}

5.4 服务调用

使用Feign进行服务调用的时候,需要手动创建⼀个服务访问客户端(接口)
配置一个服务降级处理类

5.4.1 创建Feign客户端抽象类

//与服务提供者注册的application:name相同,fallback 指向对应服务降级类
@FeignClient(value = "order-add", fallback = OrderAddClientFallback.class)
public interface OrderAddClient {//路径为服务提供者的服务访问地址 抽象方法与服务相同@PostMapping("order/add")public ResultVO addOrder(Order order);
}

5.4.2 创建服务降级处理类

FeignClient的服务降级类:1.必须实现Feign客户端接⼝,2.必须交给Spring容器管理

@Component
public class OrderAddClientFallback implements OrderAddClient {public ResultVO addOrder(Order order) {System.out.println("-------addOrder的降级服务");return ResultVO.fail("fail",null);}
}

5.4.3 service中调用Feign客户端服务

@Service
public class OrderAddServiceImpl implements OrderAddService {@Autowiredprivate OrderAddClient orderAddClient;//当我们创建Feign客户端的降级类并交给Spring管理后 在Spring容器中就会出现两个OrderAddClient对象//此处会显示编译错误 不用管@Overridepublic ResultVO saveOrder(Order order) {//1. 调⽤ order-add服务进⾏保存ResultVO vo = orderAddClient.addOrder(order);//2. 调⽤ orderitem-add 保存订单快照//3. 调⽤ stock-update 修改商品库存//4. 调⽤ shopcart-del 删除购物⻋记录return vo;}
}

5.5 Feign传参

在Feign客户端的方法中,如果不指定参数的传值方式,则默认为body传参,Get请求也不例外;
因此对于url传值如get请求,必须通过@RequestParam注解声明

  • 服务提供者
@PostMapping("/add")
public ResultVO addOrder(@RequestBody Order order,String str){System.out.println("-------------------order-add");System.out.println(order);System.out.println(str);return orderService.saveOrder(order);
}
  • 服务消费者(Feign客户端)
//1.对⽤POST请求调⽤服务,Feign客户端的⽅法参数默认为body传值(body只能有⼀个值)
//2.如果有多个参数,则需要通过@RequestParam声明参数为请求⾏传值
@FeignClient("order-add")
public interface OrderAddClient {@PostMapping("order/add")public ResultVO addOrder(Order order,@RequestParam("str") String str);//请求行传参@GetMapping("order/get")public Order getOrder(@RequestParam("orderId") String orderId);
}

六、Hystrix—熔断器

服务故障的雪崩效应:当A服务调用B服务时,由于B服务的故障导致A服务处于阻塞状态,大量的请求可能会导致A服务因资源耗尽而出现故障。
为了解决服务故障的雪崩效应,出现了熔断器模型。

6.1 使用

hystrix 已经停更 最新版本 2.2.3.RELEASE

  • 添加的依赖—hystrix
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.3.RELEASE</version>
</dependency>
  • 配置yml文件
feign:circuitbreaker:enabled: true
  • 启动类添加注解—@EnableHystrix
  • 创建服务降级处理类—OrderAddClientFallback
  • 在Feign客户端指定降级处理类—@FeignClient(value = “order-add”, fallback = OrderAddClientFallback.class)

6.2 Hystrix-Dashboard—熔断器仪表盘监控

如果服务器的并发压力过大、服务器无法正常响应,则熔断器状态变为open属于正常的情况;但是如果⼀个熔断器⼀直处于open状态、或者说服务器提供者没有访问压⼒的情况下熔断器依然为open状态,说明熔断器的状态就不属于正常情况了。如何了解熔断器的工作状态呢 ?

  • 熔断器仪表盘

6.2.1 创建 熔断器仪表盘 模块

  • 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
  • 配置文件
server:port: 9999
spring:application:name: hystrix-dashboard
hystrix:dashboard:proxy-stream-allow-list: "localhost"
  • 配置启动类
  • @EnableHystrixDashboard
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {public static void main(String[] args) {SpringApplication.run(HystrixDashboardApplication.class, args);}
}
  • 访问 http://localhost:9999/hystrix

6.2.2 配置使用了熔断器的服务可被监控

  • 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 添加配置类
@Configuration
public class DashBoardConfig {@Beanpublic ServletRegistrationBean getServletRegistrationBean(){HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();ServletRegistrationBean registrationBean =new ServletRegistrationBean(streamServlet);registrationBean.setName("HystrixMetricsStreamServlet");registrationBean.setLoadOnStartup(1);registrationBean.addUrlMappings("/hystrix.stream");return registrationBean;}
}
  • 查看指定服务的熔断器工作参数

七、Spring Cloud Config—分布式配置中心

在使用微服务架构开发的项目中,每个服务都有自己的配置文件(application.yml),如果将每个服务的配置文件直接写在对应的服务中,存在以下问题:

  1. 服务开发完成之后,需要打包部署,配置文件也会打包在jar文件中,不便于项目部署之后的配置修改(在源码中修改—重新打包—重新上传—重新运行)
  2. 微服务架构中服务很多,配置文件也很多,分散在不同服务中不便于配置的管理
  3. 如果想要对服务进行集群部署,需要打包多个jar文件,上传,运行

Config使用步骤:
1.创建⼀个Git远程仓库,用来存放配置文件
2.搭建分布式配置中心服务器(Spring Cloud Config)Config server 连接到配置文件的Git仓库并注册到eureka
3.修改每个服务Config client,删除application.yml中的所有配置,连接到分布式配置中心

7.1 创建Git远程仓库

  • 在gitee上新建一个仓库
  • 在本地D盘创建 fmmall-config目录,作为本地存放配置文件的目录,在目录中创建files子目录
  • 使用idea打开 fmmall-config 目录将此文件绑定gitee仓库
  • 将微服务的yml文件上传到gitee仓库

7.2 搭建分布式配置中心服务器 Config server

  • 添加依赖 config-server
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency>
  • 配置application.yml
server:port: 8888
spring:application:name: config-servercloud:config:server:git:uri: https://gitee.com/qfytao/fmmall-config.gitsearch-paths: filesusername: 366274379@qq.compassword: admin123
eureka:client:service-url:defaultZone: http://zhangsan:123456@localhost:8761/eureka
  • 在启动类添加注解 @EnableEurekaClient @EnableConfigServer
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}
}
  • 访问 http://localhost:8888/api-order-submit/master

7.3 修改每个服务 Config client

  • 添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  • 配置服务的application.yml
spring:cloud:config:uri: http://localhost:8888name: api-order-submitlabel: master

SpringCloud Netflix—微服务架构相关推荐

  1. 基于SpringCloud的微服务架构演变史?

    系统架构演变概述 在公司业务初创时期,面对的主要问题是如何将一个想法变成实际的软件实现,在这个时候整个软件系统的架构并没有搞得那么复杂,为了快速迭代,整个软件系统就是由"App+后台服务&q ...

  2. 微服务架构与SpringCloud:微服务架构的特点

    微服务架构与Spring Cloud 近几年大家都在谈论云原生和微服务,例如 © 云原生技术能够帮助公司和机构在私有云.公有云和混有云等新型动态环境中,构建和运行可弹性扩展的应用. 微服务架构是一项在 ...

  3. 基于SpringCloud的微服务架构分析,神仙框架!

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  4. SpringCloud学习--微服务架构

    目录 微服务架构快速指南 SOA Dubbo Spring Cloud Dubbo与SpringCloud对比 微服务(Microservice)架构快速指南 什么是软件架构? 软件架构是一个包含各种 ...

  5. SpringCloud Alibaba 微服务架构(十五)- 一文详解 Nacos 高可用特性

    前言 服务注册发现是一个经久不衰的话题,Dubbo 早期开源时默认的注册中心 Zookeeper 最早进入人们的视线,并且在很长一段时间里,人们将注册中心和 Zookeeper 划上了等号,可能 Zo ...

  6. 基于springCloud的微服务架构设计

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  7. SpringCloud Hystrix微服务架构的高并发问题与解决策略

    一.微服务架构的高并发问题 背景:由于服务器的最大处理线程数都是有上线的,比如tomcat等.当系统某时刻出现高并发请求时,如秒杀活动等,在瞬间服务器可处理线程数瞬间使用完,线程资源耗尽.当后面的其他 ...

  8. 《SpringCloud Alibaba 微服务架构》专题(二十一)-Seat简介与安装

    文章目录 1.业务场景 2.Seata简介 3.Seata原理和设计 4.seata-server的安装与配置 Seata是Alibaba开源的一款分布式事务解决方案,致力于提供高性能和简单易用的分布 ...

  9. SpringCloud Alibaba 微服务架构(十一)- 分布式事务解决方案及理论基础篇

    前言 在传统的单体应用架构中,例如经典的SSM,项目会采用分层架构模式:数据库访问层.业务逻辑层.控制层,从前端到后台所有的代码都是一个或者几个开发者去完成,该架构模式没有对我们业务逻辑代码实现拆分. ...

  10. SpringCloud Alibaba 微服务架构版本说明

    详情

最新文章

  1. 【2012年华为校园招聘软开上机-成都】字母转换、统计单词个数
  2. ORACLE基本SQL语句-查询篇
  3. iphone中结束电话后返回自己的应用
  4. 函数式编程:如何高效简洁地对数据查询与变换
  5. androidtv item获取焦点设置动画和背景_动画技术的交互应用所作的动画
  6. 咸菜可以吃吗,对健康有害吗?
  7. Transactional ejb 事务陷阱
  8. 【One by one系列】一步步部署.net core应用
  9. ajax传单参数接受不了,Choropleth传单ajax
  10. 整理发布一些关于VMware vSphere的文档
  11. 全国计算机二级c题库在线,全国计算机二级c语言考试题库
  12. 【C语言】贪吃蛇小游戏代码详解
  13. 属于计算机网络资源子网的,属于计算机网络的资源子网.pdf
  14. 三菱服务器显示003C,FX3U/FX3G系列PLC内置定位功能的当前值寄存器是什么?
  15. 【英语语法】定语从句
  16. Apple芯片Mac安装ARM版Win10完美教程(结尾附视频)
  17. 微信公众号:设置分享
  18. C++后台开发学习路线(已多人拿下腾讯后台开发)
  19. java中创建dvd_JAVA简单模拟DVD功能
  20. ​iPhone 14 Pro 全系降价 700 元;Gmail 之父:有了 ChatGPT,搜索引擎活不过两年了|极客头条...

热门文章

  1. 2020宁波银行终面一分钟抽词演讲
  2. c语言int函数使用方法,int函数的使用方法_Excel中int函数的操作用法
  3. Actor-Critic:强化学习中的参与者-评价者算法简介
  4. golang正则匹配中文字符,查询中文字符会panic退出的问题
  5. 手机模拟器自带root_VMOS Pro Android 手机上的模拟器 (手机版虚拟机)
  6. LOAP its implimenlation
  7. opencv学习十三:图像金字塔和图像梯度
  8. ASO优化:App从0到1进行ASO优化
  9. 主板BIOS中的CSM是什么
  10. EAS服务不可用或者更新一半中断解决方案