随着业务需求增加,众多企业面临代码耦合严重、效率低下的问题。在Netflix开源了一套自己的微服务架构后,Spring随即也基于此推出SpringCloud。 目前来说,SpringCloud的门槛相对较低,在了解大致SpringCloud后即可上手,更多的是配置,或者是套路上的东西。当然我这么说只是对于希望快速上手的同学而言,源码博大精深,有兴趣可以多多研究。自己做微服务的也做了半年了,现在写一个demo,总结一下springcloud的基本用法,让我们的 微服务的小车先开起来。
项目构成
项目采用module的形式,一个项目下分多个module,导入项目比较方便。
- []Eureka注册中心
- []Config配置中心
- []Oauth2认证中心
- []Zuul网关
- []api-admin服务
注册中心Eureka
Eureka作为服务的注册中心,服务间的互相调用都是通过Eureka来完成,所有的服务都将自己注册到eureka中。当A服务希望调用B服务时,A只需使用B的instanceId,而不是ip,即可完成调用。在分布式应用中,服务随机部署在各个服务器中,根据ip去调用服务极其低效,你再写代码。当服务启动多个实例时候,一般使用ribbon和feign,则会自动负载均衡,无需干预。
想启动一个Eureka服务注册中心,配置上也十分简单。首先在pom.xml中加入spring-cloud-starter-eureka-server
依赖,再在入口类中加入 注解@EnableEurekaServer
即可。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
如果Eureka只希望standalone模式(只启动一个实例),事实上在配置文件application.yml无需配置内容,配置上基本信息以及端口即可。 如果希望启动HighAvailability模式(即启动多个实例),则可以参考一下配置。
在部署的时候,使用编译后同一个jar包,在启动后输入不同参数。例如使用命令java -jar -Dspring.profiles.active=master your_jar_name.jar
, 则启动配置spring.profiles为配置master下的内容。而最上面一块的内容为公共配置,启动master配置时,实际的配置时公共配置+master配置;如果有些配置 两边都有,则master配置会覆盖公共配置内容。
#公共配置
server:
port: 8080
spring:
application:
name: eureka-server
eureka:
instance:
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 5
prefer-ip-address: true
client:
register-with-eureka: true
fetch-registry: true
---
# 配置master
spring:
profiles: master
eureka:
instance:
hostname: master
client:
service-url:
defaultZone: http://master:8080/eureka/,http://backup1:8080/eureka/,http://backup2:8080/eureka/
---
# 配置backup1
spring:
profiles: backup1
eureka:
client:
service-url:
defaultZone: http://master:8080/eureka/,http://backup1:8080/eureka/,http://backup2:8080/eureka/
---
# 配置backup2
spring:
profiles: backup2
eureka:
client:
service-url:
defaultZone: http://master:8080/eureka/,http://backup1:8080/eureka/,http://backup2:8080/eureka/
下面来说一个几个重点配置
eureka.client.registry-fetch-interval-seconds
表示服务间隔多久去Eureka中获取注册信息,默认为30s。
eureka.instance.lease-renewal-interval-in-seconds
表示服务给Eureka发送心跳间隔,默认为30s。如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也不会接收到流量。
eureka.instance.lease-expiration-duration-in-seconds
表示Eureka上次收到服务的心跳后,等待下一次心跳的时间,如果超时则移除实例,默认为90s。
eureka.server.enable-self-preservation
表示是否开启自我保护模式,默认为true。默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。 Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。 综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
eureka.server.eviction-interval-timer-in-ms
表示Eureka清理无效节点的时间间隔,默认为60,000ms。
eureka.client.register-with-eureka
表示是否将Eureka注册到自身,多实例中一边选择true。
eureka.client.fetch-registry
表示是否拉去注册的服务。假设,服务A只注册到master节点的Eureka,但是开启该选项,所有的Eureka节点都会注册该服务。
eureka.client.defaultZone
表示希望注册到Eureka的地址,格式为http://ip:port/eureka/
,如果部署环境有dns,也可以将ip换成域名,如果有是ha模式,配置多个地址用逗号隔开。
以上为Eureka配置相对重要的配置。