服务拆分力度如何?
服务集群地址如何维护?
服务之间如何实现远程调用?
访问健康状态如何感知?
• 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
• 面向服务:微服务对外暴露业务接口
• 自治:团队独立、技术独立、数据独立、部署独立
• 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
一个单体架构按功能模块进行拆分,从而变成多个服务。
微服务的拆分目的是:单一职责。一个服务只做与自己相关的事情。
例如订单模块:调用用户功能、支付功能、商品功能
⚫服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
⚫ 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
• 服务提供者:暴露接口给其它微服务调用
• 服务消费者:调用其它微服务提供的接口
• 提供者与消费者角色其实是相对的
• 一个服务可以同时是服务提供者和服务消费者
背景:只是单纯模拟生产者和消费者的情况,由此引出微服务以及注册中心。
order是商品信息,消费者。
user是用户信息,服务提供者
order查询商品信息时,并能将用户信息查询出来:
1.服务消费者如何获取服务提供者的地址信息?
2.如果多个服务提供者,消费者如何选择呢?
3.消费者如何得知服务提供者的健康状态?
一:EureKaServer:注册中心
二: EureKaClient:客户端
EureKaClient 的客户端分为:Provider服务提供者和consumer服务消费者
EurekaServer:服务端,注册中心
记录服务信息
心跳监控
EurekaClient:客户端
Provider:服务提供者
1.注册自己的信息到服务端EurekaServer
2.每隔30秒向EurekaServer发送心跳
consumer:服务消费者
根据服务名称从服务端EurekaServer拉取服务列表
基于服务列表做负载均衡,选中一个微服务后发起远程调用
消费者该如何获取服务提供者具体信息?
◆ 服务提供者启动时向eureka注册自己的信息
◆ eureka保存这些信息
◆ 消费者根据服务名称向eureka拉取提供者信息
如果有多个服务提供者,消费者该如何选择?
◆ 服务消费者利用负载均衡算法,从服务列表中挑选一个
消费者如何感知服务提供者健康状态?
◆ 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
◆ eureka会更新记录服务列表信息,心跳不正常会被剔除
◆ 消费者就可以拉取到最新的信息
三步走:
1.引入Eureka-Server依赖。配置服务端
2.添加@EnableEurekaServer注解
3.在application.yml配置Eureka地址。【为了服务注册配置信息】
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
server:
port: 10086 #服务的端口
spring:
application: #服务名称
name: eurekaserver
eureka:
client:
service-url: #eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
#eureka自己也是微服务,所以启动的时候,也将自己注册到服务
Instances currently registered with Eureka
注册到 Eureka 的实例。 Eureka会记录每一个服务的所有实例。
application:EUREKASERVER:实例的名字
status:UP (1) - LAPTOP-C3SH54RU:eurekaserver:10086
up代表正常状态,ip(电脑的名称)和端口
所以说,可以根据实例找到ip和端口。根据application找到status
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
所有配置:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
application: #服务名称
name: orderserver
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
eureka:
client:
service-url: #eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
#所以启动的时候,也将自己注册到服务
另外一个user服务,就是将下面的服务名称改一下即可。
application: #服务名称
name: userserver
ctrl +D
那么现在就是启动四个服务:就可以看到注册了两个实例。【实例列表】
四个服务:eurek/oreder/和两个userservice
一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时,如果要调试测需要依次启动各个项目比较麻烦。
idea其实提供了各module的启动管理工具了,可以快速启动和关闭各个服务,也能批量操作,比如一次性全部启动或者关闭
默认第一次打开项目的时候,idea会提示是否增加这个选项卡,如果你没点或者选择了否,则需要手动添加这个选项里卡。
手动添加方法很简单,打开项目目目录的.idea/workspace.xml文件。
找到RunDashboard节点,添加一个option节点。
<option name="configurationTypes">
<set>
<option value="SpringBootApplicationConfigurationType" />
set>
option>
如果没有找到RunDashboard节点,则增加一个RunDashboard节点
<component name="RunDashboard">
<option name="configurationTypes">
<set>
<option value="SpringBootApplicationConfigurationType" />
set>
option>
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
RuleState>
list>
option>
component>
根据服务名获取列表,就不用写ip端口了,直接写服务名称即可
发送请求
去注册中心拉取服务,得到服务列表:
IRule 决定了负载均衡的策略
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: userservice # 指定对userservice这个服务饥饿加载