微服务基础

  • Post author:
  • Post category:其他




微服务的基本概念、设计及拆分原则



什么是微服务



单体应用痛点:

①项目庞大,可能使用几十张表,结构关系比较复杂

②容易出现尾大不掉的情况

③代码风格及组件不统一

④技术难以升级



什么是服务化

①拆分:将大而全的程序拆分为小而美的模块

②独立:模块间彼此独立,独立部署,职责分明

③通信:模块间使用API调用,不关心彼此实现



什么是微服务

①以专注于单一职责与功能的小型功能区为基础

②利用模块化方法组合成一个大型复杂系统

③各模块之间使用与语言无关的API集相互通信



微服务优势

①技术不受限,新技术有发展空间

②可用性强,一个模块宕机不会整体宕机

③代码及机器使用率上升



微服务缺点

①运维成本高

②接口可能不匹配

③代码可能重复

④架构复杂度高



微服务的特点

①技术栈自由

②按需弹性扩容

③能力复用率高

④部署和回滚成本低

⑤康威定律:微服务导致组织结构发生变动



微服务与SpringCloud关系



微服务分为两大门派:

  • SpringCloud:由Spring众多子项目组成的
  • Dubbo:高性能-轻量级的开源框架

Dubbo提供的功能实际上是SpringCloud的子集,Dubbo通信协议采用RPC通信,所以效率比较高,SpringCloud使用的是REST,所以更加灵活。从生态上看,SpringCloud的迭代速度,稳定性,生态稍稍好一点 ,但是Dubbo目前属于Apache,所以也还可以。

那么我们如何选型呢?实际上就考虑团队里针对于技术的熟悉程度。



微服务拆分



微服务拆分的信号:

  1. 事故频发,且原因是耦合导致的
  2. 服务启动/部署越来越慢
  3. 流量增加,需要扩容



不适合拆分的场景

  1. 为了拆分而拆分
  2. 系统要求变动和维护成本低
  3. 团队规模小,人数少于5个



如何拆分

  1. 按照领域拆分
  2. 热点拆分(按照压力不同拆开)
  3. 业务拆分,逐步迭代
  4. 统筹安排,全局考虑



服务拓展的几种方式

  1. 单体集群,水平复制
  2. 微服务:功能解耦
  3. 数据拆分:分库分表

    按需拓展:可能合理利用CPU,内存,网络负载程度,在特定时间拓展服务,这种方式具有最佳使用率,节省成本



微服务常见组件及功能(重点)

  1. 服务注册与发现
  2. 微服务之间的调用
  3. 负载均衡
  4. 网关
  5. 熔断与降级



微服务实战



基本介绍



SpringCloud定位

成熟的微服务框架框架,定位为开发工具,以便于快捷构建分布式系统



核心组件

  1. 服务注册中心:SpringCloud NetFlix Eureka
  2. 服务调用方式:RestAPI,Feign,ribbon
  3. 服务网关:Spring Cloud Netflix Zuul
  4. 断路器:Spring Cloiud Netflix Hystrix



架构介绍

项目整体设计分为业务模块:课程列表,课程价格;微服务相关的包括:网关,注册中心等



接口设计

包括课程列表模块的一个课程查询,价格模块的价格查询以及feign调用列表模块获取课程并查询出对应课程价格的组合接口



分模块构建



分布式架构搭建流程:

  1. 新建Spring Boot项目
  2. 删除Src目录
  3. 新建module,建立maven项目
  4. 删除src目录
  5. 分别新建列表模块,价格模块



Course-list模块搭建

  1. 新建目录
  2. 建立Application,加上@SpringApplication注解,表示Springboot项目启动
  3. 引入依赖:

    spring-boot-starter-web(SpringBoot需要)

    mysql-connector-java(mysql需要)

    mybatis-spring-boot-starter(mybatis需要)

    maven插件(spring-boot-maven-plugin)
  4. resources引入配置文件application.properties
  5. 正常开发SpringBoot项目
  6. 注意点:

    开启驼峰配置

    @Mapper引入时有爆红,是因为引入mybatis注解版本不对导致



course-price搭建

搭建同course-list



开发实现

详情见

gitee



服务整合、注册与发现



Eureka

当没有Eureka之前,接口的调用一般使用rest接口,此时就有一个问题,访问接口需要配置号ip地址,但是微服务架构时,可能存在多实例部署,且会出现ip变化情况,此时ip写死就比较麻烦。

此时,就不得不举出另一个例子——医院总机,问哦们不需要记住所有部门的电话,所有电话都在医院总机,我们找任何一个部门都只需要找到总机即可。



Eureka架构

在这里插入图片描述

服务提供者在注册中心注册上服务,服务调用方从注册中心获取地址,然后实际访问服务提供方。



微服务引入Eureka

  1. 引入依赖

    引入Spring Cloud

    引入Eureka(eureka服务端引入 spring-cloud-starter-netflix-eureka-server、client端引入spring-cloud-starter-netflix-eureka-client)

    2.配置文件:详情见gitee代码

    3.启动注解(eureka端增加注解:@EnableEurekaServer)

    4.注意点:SpringBoot与SpringCloud版本保持一致,否则会报错,注册不上



module转为Eureka的client

  1. 引入eureka-client依赖
  2. 新加eureka.client.service-url.defaultZone=http://localhost:8000/eureka/,与eureka-server地址保持一致



整合Feign实现服务间调用

SpringCloud中默认使用Http调用(比较复杂),我们引入微服务的目的是为了方便,简洁,而不是使得服务调用越来越复杂,所以在这里引入了Feign调用。



集成Feign

  1. 引入依赖:Spring-Cloud-starter-openfeign
  2. 增加配置文件:负载均衡配置
  3. 启动类增加注解:@EnableFeignClients
  4. 建立客户端:建包,建立调用类,类头上增加@FeignClient注解
  5. Controller调用feignClient



利用Ribbon实现负载均衡



负载均衡的策略:(com.netflix.loadbalancer)

  • RandomRule:随机策略
  • RandomRobinRule:轮询策略
  • ResponseTimeWeightedRule:加权,根据每个service的平均响应时间来分配



配置不同的负载均衡策略

application配置文件增加配置:

前面

course-list

是调用的注册到eureka的server-id,

com.netflix.loadbalancer.RoundRobinRule

是策略

course-list.ribbon.NFLoadBanlancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule



服务的熔断与降级,并实操演练

利用Hystrix实现断路器,步骤如下:

  1. 配置文件增加配置:feign.circuitbreaker.enabled=true
  2. 引入依赖:spring-cloud-starter-netflix-hystrix(调用方)
  3. 启动类增加注解@EnableCircuitBreaker
  4. 编写熔断处理代码,调用异常时有备用返回



网关的集成与开发,并接入服务

网关使用Zuul,主要用作身份验证,安全处理等



集成Zuul

  1. 把自己注册到注册中心
  2. 引入依赖

    spring-cloud-starter-netflix-eureka-client

    spring-cloud-starter-zuul

    引入plugin-maven
  3. 增加注解(网关微服务上)

    @EnableZuulProxy

    @SpringCloudApplication

    4.配置对应路由地址
#统一前缀
zuul.prefix=/imooc
#映射地址
zuul.routes.course-list.path=/list/**
#服务id
zuul.routes.course-list.service-id=course-list

zuul.routes.course-price.path=/price/**
zuul.routes.course-price.service-id=price-list



利用网关开发过滤器



过滤器类型:

  1. pre:请求调用亲自
  2. route:调用中
  3. post:请求后
  4. error:异常时



开发过滤器

1.新建过滤器继承ZuulFilter

2.开发对应业务逻辑



版权声明:本文为HBUT_WANGWEI原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。