服务治理:Spring Cloud Eureka实践

服务治理

  • 服务注册
    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管理界面

启动提供者服务后的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服务中心后,结果如下图:


peer2服务中心截图
peer1服务中心截图

此时修改提供者的配置文件:

#其他配置不变,仅修改默认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.client为开头

服务实例类配置

此处要特别提到健康监控的端点配置因为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端点路径已经改成了我们所配置的路径:


配置的health端点路径

其他实例相关配置

以上配置以eureka.instance开头

更多配置可以直接参考:
服务端配置:org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration
这些配置以eureka.server开头
客户端配置:org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration
这些配置以eureka.client开头
实例相关配置:com.netflix.appinfo.InstanceInfo
这些配置以eureka.instance开头

你可能感兴趣的:(服务治理:Spring Cloud Eureka实践)