发布时间:2024-05-30 08:01
概念:微服务是系统架构的一种设计风格,将一个原本独立的服务拆分成多个小型服务,每个服务独立运行在在各自的进程中,服务之间通过 HTTP RESTful API 进行通信.每个小型的服务都围绕着系统中的某个耦合度较高的业务进行构建。微服务是一种经过良好设计的分布式架构方案,而全球的互联网公司都在积极尝试自己的微服务落地方案。其中在java领域最引人注目的是SpringCloud提供的方案。
微服务架构特征
3.1单一职责:微服务拆分粒度更小,每个服务都应对唯一的业务能力,做到单一职责
3.2自治:团队独立、技术独立、数据独立,独立部署和交付
3.3面向服务:服务提供统一标准的接口,与语言无关、与技术无关
3.4隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
SpringCloud是目前国内使用最广泛的微服务技术栈。官网地址:https://spring.io/projects/spring-cloud。
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:
SpringCloud与SpringBoot的版本兼容关系,可以去看GitHub源码里面有介绍;
单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统
分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝
微服务:一种良好的分布式架构方案
优点:拆分粒度更小、服务更独立、耦合度更低
缺点:架构非常复杂,运维、监控、部署难度提高
SpringCloud:SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件
按照上面调用流程,消费者调用服务者存在很多问题:
1:服务消费者该如何获取服务提供者的地址信息?
2:如果有多个服务提供者,消费者该如何选择?
3:消费者如何得知服务提供者的健康状态?
#1:消费者该如何获取服务提供者具体信息?
服务提供者启动时向eureka注册自己的信息
eureka保存这些信息
消费者根据服务名称向eureka拉取提供者信息
#2:如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个
#3:消费者如何感知服务提供者健康状态?
服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
eureka会更新记录服务列表信息,心跳不正常会被剔除
消费者就可以拉取到最新的信息
spring-cloud-starter-netflix-eureka-server
的依赖:<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
@EnableEurekaServer:开启EurekaServer功能
server:
port: 8001 #端口号
spring:
application:
name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
client:
register-with-eureka: false #是否将自己注册到Eureka中
fetch-registry: false #是否从eureka中获取服务信息
service-url:
defaultZone: http://localhost:8001/eureka
spring-cloud-starter-netflix-eureka-client
的依赖到生产者:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
spring:
application:
name: user #该name会被用到服务中心
eureka:
client:
service-url:
# EurekaServer的地址
defaultZone: http://localhost:8001/eureka
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}:@project.version@
lease-renewal-interval-in-seconds: 30 #心跳周期,默认是30秒
lease-expiration-duration-in-seconds: 90 #心跳失败最长超时间,默认90秒
ip-address: localhost #ip地址
spring-cloud-starter-netflix-eureka-client
的依赖到生产者:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
spring:
application:
name: order #该name会被用到服务中心
eureka:
client:
service-url:
# EurekaServer的地址
defaultZone: http://localhost:8001/eureka
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}:@project.version@
lease-renewal-interval-in-seconds: 30 #心跳周期,默认是30秒
lease-expiration-duration-in-seconds: 90 #心跳失败最长超时间,默认90秒
ip-address: localhost #ip地址
效果和生产者一样。
消费者也可以是生产者,生产者也可以是消费者
之前消费者调用生产者URL路径:
//地址固定、单一
String url = "http://localhost:18081/user/" + orderInfo.getUserName();
现在消费者调用生产者URL路径:
//第一个user是服务中心的user地址及
//配置文件里的spring.application:.name: order
String url = "http://user/user/" + orderInfo.getUserName();
注意:需要开启负载均衡
RestTemplate方法实现可以使用注解:@LoadBalanced //开启负载均衡
或者开启全局负载均衡