服务治理
- 服务注册
1.各个服务在启动时,都会向配置的服务中心进行服务注册,将自己的IP与端口号,服务名称等信息告诉给服务中心,服务中心会维护类似于一张服务名--服务位置的表;同时,各服务还会定时向注册中心周期性的发送心跳更新服务租约。如果超过配置的更新时间最大间隔(即最后一次更新租约时间后,多长时间未更新),则 服务中心认为该服务实例不可用。 - 服务发现
1.在服务治理框架下,服务间的调用不再是通过指定地址进行服务访问。而是服务将调用的服务名发送到服务中心,从服务中心获取所有服务的实体清单,然后实现对其他服务的调用(多个调用实例,在框架下还会进行轮询调用服务其中的一个实例)。
2.以上只是服务发现的简单原理逻辑,实际上,根据不同的服务中心,并不一定每次调用服务都会去服务中心获取最新的服务清单,以及在清单缓存和不可用服务剔除方面都有不同的处理策略!
Eureka
服务端
1.简况:
即服务注册中心,依托强一致性来提供良好的可用性。如果是以集群方式部署,其中某个分片故障后,Eureka就会转入自我保护模式,允许在故障期间继续进行服务注册与发现;等到故障分片恢复时,集群其他分片会再把它们的状态进行同步。集群中的分片会互相复制各自的状态(异步)。
Eureka服务端搭建
#主要pom依赖
UTF-8
UTF-8
1.8
1.4.5.RELEASE
Hoxton.SR3
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-security
#Springboot项目启动类
@SpringBootApplication
@EnableEurekaServer //该注解开启该服务作为Eureka服务端
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
#application.yml相关配置
server:
port: 8090 #服务注册中心端口号
eureka:
server:
enableSelfPreservation: false
eviction-interval-timer-in-ms: 2000
instance:
hostname: localhost #服务注册中心实例的主机名
client:
registerWithEureka: false #是否向服务注册中心注册自己,对于单个服务中心来说,由于本身就是服务中心,不需要自己注册自己
fetchRegistry: false #是否检索服务,对于单个服务中心,不需要去检索其他服务
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #eureka管理页面路径配置,即http://localhost:8090/eureka
spring:
application:
name: eureka
security: #如下安全配置是进入eureka(访问localhost:8090)时,需要下面账号登录验证
basic:
enable: true
user:
name: laohu
password: 123456
#进入/访问eureka的账号密码验证SpringSecurity配置类
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
super.configure(http);
}
}
至此,一个简单的单个Eureka服务中心就已经搭建完成了。
客户端:
1.简况
嵌于客户端服务的代码中,向Eureka服务中心进行服务注册与发现。在程序运行时,会向服务中心注册自己的服务并周期性的发送心跳,同时也会周期性的从服务中心获取服务清单信息缓存到本地。
Eureka客户端搭建(即提供者服务)
#主要pom
1.8
Hoxton.SR3
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
#客户端服务启动类
@SpringBootApplication
//eureka客户端发现注解
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
#application.yml配置
#常见的服务端口配置省略,记得自行配置上
spring:
application:
name: provider #服务名称
eureka:
client:
service-url:
defaultZone: http://laohu:123456@localhost:8090/eureka/ #需要配置eureka服务端的注册地址(laohu:123456 为我们在eureka服务端配置的访问账户和密码)
#是否从eureka获取服务清单,作为服务客户端,需要从eureka拉取服务清单
fetch-registry: true
#是否将服务注册到eureka,作为服务客户端,需要将服务注册到eureka
register-with-eureka: true
#向eureka服务端更新自己实例信息的间隔时间(s)
instance-info-replication-interval-seconds: 15
#从eureka客户端获得服务清单的间隔时间(s)
registry-fetch-interval-seconds: 15
#如果在同一个服务在同一台机器上启动多个相同服务,可配置如下实例名称区分
instance:
instance-id: ${spring.application.name}:${random.int}
#服务提供者provider控制器
@RestController
@RequestMapping("/provider")
public class HelloController {
/**
* 启动类开启@EnableDiscoveryClient注解后,springboot自动注入该客户端发现接口的实例
*/
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/eurekaInfo",method = RequestMethod.GET)
public String eurekaInfo(){
//通过配置文件中的服务名,获取从eureka拉取的对应的服务实例
List provider = client.getInstances("provider");
//由于只注册一个provider实例,因此获取第一个实例即可
ServiceInstance instance = provider.get(0);
//打印出当前实例的相关信息
System.out.println("服务提供者实例host地址: "+instance.getHost()+",服务id: "+instance.getServiceId()+",实例id: "+
instance.getInstanceId()+"////服务元数据: "+instance.getMetadata());
return "hello provider";
}
}
服务启动后,刷新eureka管理界面
访问http://localhost:7001/provider/eurekaInfo,控制台打印出如下内容:
高可用服务注册中心
首先我们配置以下两个eureka配置文件:
#在eureka服务中心的项目下创建application-peer1.yml文件,将原application文件的服务中心配置复制过来,修改其中部分内容
server:
port: 8090 #服务注册中心端口号
eureka:
server:
enableSelfPreservation: false
eviction-interval-timer-in-ms: 2000
instance:
hostname: peer1 #服务注册中心实例的主机名1,windows系统需要去C:/windows/system32/driver/etc/hosts文件中配置 127.0.0.1 peer1 本地映射
#对于linux系统来说,hostname以及defaultZone访问路径可以配置成服务器IP地址,但是需要新增配置eureka.instance.prefer-ip-address 为true
client:
registerWithEureka: true #对于高可用,则需要向其他中心注册自己
fetchRegistry: true #对高可用注册中心,则需要从其他中心拉取服务清单
serviceUrl:
defaultZone: http://laohu:123456@peer2:8091/eureka/ #peer1需要向peer2服务中心地址注册自己
spring:
application:
name: eureka
security: #如下安全配置是进入eureka(访问localhost:8090)时,需要下面账号登录验证
basic:
enable: true
user:
name: laohu
password: 123456
#在eureka服务中心的项目下创建application-peer2.yml文件,将原application文件的服务中心配置复制过来,修改其中部分内容
server:
port: 8091 #服务注册中心端口号
eureka:
server:
enableSelfPreservation: false
eviction-interval-timer-in-ms: 2000
instance:
hostname: peer2 #服务注册中心实例的主机名1,windows系统需要去C:/windows/system32/driver/etc/hosts文件中配置 127.0.0.1 peer2 本地映射
#对于linux系统来说,hostname以及defaultZone访问路径可以配置成服务器IP地址,但是需要新增配置eureka.instance.prefer-ip-address 为true
client:
registerWithEureka: true #对于高可用,则需要向其他中心注册自己
fetchRegistry: true #对高可用注册中心,则需要从其他中心拉取服务清单
serviceUrl:
defaultZone: http://laohu:123456@peer1:8090/eureka/ #peer2需要向peer1服务中心地址注册自己
spring:
application:
name: eureka
security: #如下安全配置是进入eureka(访问localhost:8090)时,需要下面账号登录验证
basic:
enable: true
user:
name: laohu
password: 123456
根据这两个配置文件启动eureka服务中心后,结果如下图:
此时修改提供者的配置文件:
#其他配置不变,仅修改默认zone配置,将provider服务注册到两个服务中心
eureka:
client:
service-url:
defaultZone: http://laohu:123456@peer1:8090/eureka/,http://laohu:123456@peer2:8091/eureka/
启动后,就会发现provider服务注册到了peer1和peer2服务中心,如peer1与peer2管理界面所示
Eureka其他相关配置
以Eureka为服务中心核心构建的微服务体系,更多的组成是多种多样的服务。因此,我们在进行相关注册配置时,更多的是面向eureka客户端的配置。
服务注册类配置
服务实例类配置
此处要特别提到健康监控的端点配置。因为Eureka默认的健康状态检查,是Eureka客户端提供的心跳检测机制,该机制默认认为只要客户端服务进程存活,就是UP状态;但是对于客户端所依赖的其他外部资源(比如数据库配置等)失效等情况不能有效的识别。(即客户端服务没有down,但是其关联的数据源等连接不上,相关的正常服务提供不了,但Eureka仍旧显示服务为UP状态)
在实例端点配置中,实际上有两个非常重要的配置:
#在provider的基础上,新增健康检测端点监控配置,将Eureka健康检测通过actuator的端点来处理,而不是默认的客户端心跳检测
eureka:
#将eureka健康检测交给spring-boot-actuator模块的health端点
healthcheck:
enabled: true
#health端点访问路径(开启healthcheck功能后,则eureka通过/health端点来检测服务状态.所以必须保证该路径能够被Eureka服务中心访问到)
#当然,大部分情况下,这两个路径参数可以不配置,默认为actuator端点原始路径
health-check-url-path: /${management.endpoints.web.path-mapping.health}
#info端点访问路径(如果服务中心访问不到该路径,则在Eureka管理面板中,不能获得服务的详细信息)
status-page-url-path: /${management.endpoints.web.path-mapping.info}
#actuator监控端点暴露配置
management:
endpoint:
health:
show-details: always #health端点显示健康状态细节
endpoints:
web:
#配置health和info端点的访问路径,更改为/healthCheck 和 infoCheck
base-path: /
path-mapping:
health: healthCheck
info: infoCheck
访问结果如下图所示,可见actuator的health端点路径已经改成了我们所配置的路径:
其他实例相关配置
更多配置可以直接参考:
服务端配置:org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration
这些配置以eureka.server开头
客户端配置:org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration
这些配置以eureka.client开头
实例相关配置:com.netflix.appinfo.InstanceInfo
这些配置以eureka.instance开头