微服务与单体架构区别

1、单体架构所有模块全都耦合在一起,代码量大,维护困难。

  1. 微服务每个模块相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决

2、单体架构所有的模块都共用一个数据库,存储方式比较单一

  1. 微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。

3、单体架构所有的模块开发所使用的技术一样

  1. 微服务每个模块都可以使用不同的开发技术,开发模式更灵活。

微服务开发框架

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

  1. <!--服务调用-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

3.在调用端的启动类添加注解

  1. @EnableFeignClients //开启OpenFeign服务调用

4.创建包和接口

创建client包

  • @FeignClient注解用于指定从哪个服务中调用功能,名称与被调用的服务名保持一致,如@FeignClient(“boot服务名称”)
  • @GetMapping注解用于对被调用的微服务进行地址映射
  • @PathVariable注解一定要指定参数名称,否则出错,如@PathVariable(“id”)

    1. 可能的异常:status 404 reading VodClient#deleteVideoById(String)
    2. @FeignClient和[@DeleteMapping ](/DeleteMapping ) 有奇怪的冲突,会造成解析不出参数的情况,改成post请求就可以了。
    3. feign.FeignException$InternalServerError: status 500 reading XXX,大致是远程调用方法的方法存在异常
  • @Component注解防止,在其他位置注入CodClientyidea报错

5.执行

  1. @FeignClient(value = "vod-api", path = "/api/aliyun/vod/video")
  2. @Component
  3. public interface VodClient {
  4. @ApiOperation("阿里云-上传视频")
  5. @PostMapping("/uploadVideo")
  6. public Result uploadVideo(MultipartFile file);
  7. @ApiOperation("阿里云-通过视频ID获取视频播放凭证")
  8. @GetMapping("/getVideoPlayAuthById/{id}")
  9. public Result getVideoPlayAuthById(@ApiParam(name = "videoId", value = "视频id", required = true) @PathVariable("id") String id);
  10. @ApiOperation("阿里云-通过视频ID获取视频播放地址")
  11. @GetMapping("/getVideoPlayUrlById/{id}")
  12. public Result getVideoPlayUrlById(@ApiParam(name = "videoId", value = "视频id", required = true) @PathVariable("id") String id);
  13. //定义调用方法的路径
  14. @DeleteMapping(value = "/deleteVideoById/{id}")
  15. public Result deleteVideoById(@PathVariable("id") String id);
  16. }

熔断器Hystrix

一、基本概念

1.Spring Cloud调用接口过程

Spring Cloud在接口调用上,大致会经过如下几个组件配合:

Feign —-——>Hystrix —>Ribbon一>Http Client (apache http conponents或者 okhttp)具体交互流程上,如下图所示:

微服务 - 图1

微服务 - 图2

2.Hystrix概念

重点:

  • 服务熔断
  • 服务降级

Hystrix是一个供分布式系统使用,提供延迟和容错功能,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。

比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,从而带来很大的风险。SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。下图表示服务B触发了断路器,阻止了级联失败

微服务 - 图3

二、Feign结合Hystrix使用

1.api模块pom.xml中添加依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-stater-netflix-ribbon</artifactId>
  4. <version></version>
  5. </dependency>
  6. <!--Hystrix依赖,主要是用@HystrixCommand-->
  7. <dependency>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-stater-netflix-hystrix</artifactId>
  10. <version></version>
  11. </dependency>
  12. <!--服务注册-->
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-stater-alibaba-discovery</artifactId>
  16. <version></version>
  17. </dependency>
  18. <!--服务调用-->
  19. <dependency>
  20. <groupId>org.springframework.cloud</groupId>
  21. <artifactId>spring-cloud-stater-openfeign</artifactId>
  22. <version></version>
  23. </dependency>

2.在配置文件中添加hystrix配置

  1. #开启熔断机制
  2. feign.hytrix.enabled=true
  3. #设置hytrix超时时间,默认1000ms
  4. hytrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
  5. #新版为
  6. hystrix:
  7. metrics:
  8. polling-interval-ms:5000

3.在client包里面创建熔断器的实现类

  1. /**
  2. * 出错后执行
  3. */
  4. @Component
  5. public class VodFileDegradeFeignClient implements VodClient{
  6. @Override
  7. public Result uploadVideo(MultipartFile file) {
  8. return Result.ERROR("上传失败");
  9. }
  10. @Override
  11. public Result getVideoPlayAuthById(String id) {
  12. return Result.ERROR("视频凭证获取失败");
  13. }
  14. @Override
  15. public Result getVideoPlayUrlById(String id) {
  16. return Result.ERROR("视频播放地址获取失败");
  17. }
  18. @Override
  19. public Result deleteVideoById(String id) {
  20. return Result.ERROR("视频删除失败");
  21. }
  22. @Override
  23. public Result deleteVideoBatch(List<String> ids) {
  24. return Result.ERROR("删除多个视频时出错");
  25. }
  26. }

服务网关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链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

微服务 - 图4

2.Spring Cloud Gateway特性

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

微服务 - 图5

3.GateWay工作流程

微服务 - 图6

分布式配置Config

消息总线Bus

SpringCloud的版本

微服务 - 图7

微服务 - 图8

Nacos 注册中心

微服务 - 图9

基本概念

(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结构图

微服务 - 图10

微服务 - 图11

微服务 - 图12

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

  1. <!--Nacos服务注册-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

2.在要注册服务的配置文件中 进行配置Nacos地址 application

  1. #yml配置Nacos服务地址
  2. spring:
  3. cloud:
  4. nacos:
  5. discovery:
  6. server-addr: 127.0.0.1:8848
  7. #properties配置Nacos服务地址
  8. spring.cloud.nacos.discovery.server-addr=8848

3.在启动类上添加注解

  1. @EnableDiscoveryClient //开启Nacos注册