微服务与单体架构区别
1、单体架构所有模块全都耦合在一起,代码量大,维护困难。
微服务每个模块相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决
2、单体架构所有的模块都共用一个数据库,存储方式比较单一
微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
3、单体架构所有的模块开发所使用的技术一样
微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
微服务开发框架
SpringCloud
Dubbo
Dropwizard 关注单个微服务开发
Consul、etcd&etc 微服务的模块
SpringCloud和SpringBoot是什么关系
Spring Boot 是spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的开发工具;Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现,必须基于Spring Boot开发。可以单独使用Spring Boot开发项目,但是Spring Cloud离不开Spring Boot。
- SpringCloud并不是一种技术,是很多技术总称,很多框架集合
- SpringCloud里面有很多框架(技术),使用SpringCloud里面这些框架实现微服务操作
- 使用SpringCloud,需要依赖技术SpringCloud
SpringCloud相关基础服务组件
服务发现Eureka
服务调用Feign
1.基本概念
- Feign是Netlx开发的声明式、模板化的HTTP客户端,Feign可以帮助我们更快捷、优雅地调用HTTP API
- Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
- Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
- Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
- Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
2.在service模块添加pom依赖
<!--服务调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
3.在调用端的启动类添加注解
@EnableFeignClients //开启OpenFeign服务调用
4.创建包和接口
创建client包
- @FeignClient注解用于指定从哪个服务中调用功能,名称与被调用的服务名保持一致,如@FeignClient(“boot服务名称”)
- @GetMapping注解用于对被调用的微服务进行地址映射
@PathVariable注解一定要指定参数名称,否则出错,如@PathVariable(“id”)
可能的异常:status 404 reading VodClient#deleteVideoById(String)@FeignClient和[@DeleteMapping ](/DeleteMapping ) 有奇怪的冲突,会造成解析不出参数的情况,改成post请求就可以了。feign.FeignException$InternalServerError: status 500 reading XXX,大致是远程调用方法的方法存在异常
@Component注解防止,在其他位置注入CodClientyidea报错
5.执行
@FeignClient(value = "vod-api", path = "/api/aliyun/vod/video")@Componentpublic interface VodClient {@ApiOperation("阿里云-上传视频")@PostMapping("/uploadVideo")public Result uploadVideo(MultipartFile file);@ApiOperation("阿里云-通过视频ID获取视频播放凭证")@GetMapping("/getVideoPlayAuthById/{id}")public Result getVideoPlayAuthById(@ApiParam(name = "videoId", value = "视频id", required = true) @PathVariable("id") String id);@ApiOperation("阿里云-通过视频ID获取视频播放地址")@GetMapping("/getVideoPlayUrlById/{id}")public Result getVideoPlayUrlById(@ApiParam(name = "videoId", value = "视频id", required = true) @PathVariable("id") String id);//定义调用方法的路径@DeleteMapping(value = "/deleteVideoById/{id}")public Result deleteVideoById(@PathVariable("id") String id);}
熔断器Hystrix
一、基本概念
1.Spring Cloud调用接口过程
Spring Cloud在接口调用上,大致会经过如下几个组件配合:
Feign —-——>Hystrix —>Ribbon一>Http Client (apache http conponents或者 okhttp)具体交互流程上,如下图所示:


2.Hystrix概念
重点:
- 服务熔断
- 服务降级
Hystrix是一个供分布式系统使用,提供延迟和容错功能,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。
比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,从而带来很大的风险。SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。下图表示服务B触发了断路器,阻止了级联失败

二、Feign结合Hystrix使用
1.api模块pom.xml中添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stater-netflix-ribbon</artifactId><version></version></dependency><!--Hystrix依赖,主要是用@HystrixCommand--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stater-netflix-hystrix</artifactId><version></version></dependency><!--服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stater-alibaba-discovery</artifactId><version></version></dependency><!--服务调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stater-openfeign</artifactId><version></version></dependency>
2.在配置文件中添加hystrix配置
#开启熔断机制feign.hytrix.enabled=true#设置hytrix超时时间,默认1000mshytrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000#新版为hystrix:metrics:polling-interval-ms:5000
3.在client包里面创建熔断器的实现类
/*** 出错后执行*/@Componentpublic class VodFileDegradeFeignClient implements VodClient{@Overridepublic Result uploadVideo(MultipartFile file) {return Result.ERROR("上传失败");}@Overridepublic Result getVideoPlayAuthById(String id) {return Result.ERROR("视频凭证获取失败");}@Overridepublic Result getVideoPlayUrlById(String id) {return Result.ERROR("视频播放地址获取失败");}@Overridepublic Result deleteVideoById(String id) {return Result.ERROR("视频删除失败");}@Overridepublic Result deleteVideoBatch(List<String> ids) {return Result.ERROR("删除多个视频时出错");}}
服务网关GateWay
1.基本概念
SpringCloud GateWay是Spring Cloud的一个全新项目,基于Spring5.0 + Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在微服务架构提供一种简单有效的统一的API路由管理方式。
SpringCloud GateWay 作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud2.0以上版本,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud GateWay是基本WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud GateWay的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

2.Spring Cloud Gateway特性
- 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上
- 能够匹配任何请求属性上的路由。
- 谓词和过滤器特定于路由。
- Hystrix断路器集成。
- Spring Cloud DiscoveryClient集成
- 易于编写的谓词和过滤器
- 请求速率限制
- 路径改写

3.GateWay工作流程

分布式配置Config
消息总线Bus
SpringCloud的版本


Nacos 注册中心

基本概念
(1) Nacos是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
(2)常见的注册中心:
- Eureka(原生,2.0遇到性能瓶颈,停止维护)
- Zookeeper (支持,专业的独立产品。例如: dubbo )
- Consul(原生,GO语言开发)
- Nacos
相对于Spring Cloud Eureka来说,Nacos更强大。Nacos = Spring Cloud Eureka + Spring Cloud ConfigNacos可以与Spring,Spring Boot, Spring Cloud集成,并能代替Spring Cloud Eureka,Spring Cloud Config-通过 Nacos Server和spring-cloud-starter-alibaba-nacos-discovery实现服务的注册与发现。
(3) Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。Nacos主要提供以下四大功能∶
- 服务发现和服务健康监测
- 动态配置服务
- 动态DNS服务
- 服务及其元数据管理
(4)Nacos结构图



Nacos下载和安装
(1)下载地址和版本
下载地址:https://github.com/alibaba/nacos/releases
下载版本:nacos-server-1.1.4.tar.gz 或 zip,解压任意目录即可
(2)启动Nacos服务
Linux/Mac 启动命令
- standlone代表单机模式运行,非集群模式
- sh startup.sh -m standlone
(3)访问Nacos
地址 http://localhost:8848/nacos/index.html
默认用户名/密码 nacos/nacos
服务注册
1.引入依赖 pom.xml
<!--Nacos服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
2.在要注册服务的配置文件中 进行配置Nacos地址 application
#yml配置Nacos服务地址spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848#properties配置Nacos服务地址spring.cloud.nacos.discovery.server-addr=8848
3.在启动类上添加注解
@EnableDiscoveryClient //开启Nacos注册
