SpringCloud微服务知识整理三:服务治理 Spring Cloud Eureka

什么是Spring Cloud Eureka

Spring Cloud Eureka是Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能。Spring Cloud 通过为Eureka增加了Spring Boot风格的自动化配置,我们只需通过引入依赖和注解配置就能让Spring Boot构建的微服务应用轻松的与Eureka服务治理体系进行整合。

一、服务治理

服务治理是微服务架构中最核心的基础模块,主要实现各个微服务实例的自动化注册与发现

1、Netflix Eureka

Spring Cloud Eureka既包含了服务端组件也包含客户的组件,采用Java编写,主要使用Java的分布式系统,但有RESTful API也支持其他平台。
Eureka服务端-服务注册中心,支持高可用配置。
Eureka客户端-处理服务注册与发现。

2、搭建服务注册中心

1.新建一个springboot项目,添加eureka server的依赖。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.RC2</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  </dependencies>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

对比1.0可以发现,jar包依赖换了名字。
spring-cloud-starter-netflix-eureka-server

2.添加启动类

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

    @Configuration
    public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().permitAll()//
                .and().csrf().disable();
        }
    }
}

3.配置文件application.properties

spring.application.name=spring-cloud-eureka-server
server.port=8761
eureka.instance.hostname=localhost
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

4.然后启动访问端口就可以看到Eureka信息面板

3、注册服务提供者

添加一个既有的spring boot应用到Eureka的服务治理体系中去。将其作为一个微服务应用向服务注册中心发布自己。

1.同样在pom.xml中增加spring cloud eureka 模块的依赖。

2.新建RESTful API,通过注入DiscoveryClient对象,在日志中打印出服务的相关内容。

3.在主类中添加 @EnableDiacoveryClient 注解,激活Eureka 中的DiscoveryClient 实现(自动化配置,创建DiscoveryClient接口针对Eureka客户端的EurekaDiscoveryClient实例),才能实现上述对服务信息的输出。

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

4.修改application.properties文件,通过spring.application.name属性为服务命名,再通过eureka.client.service-url.defaultZone 属性来指定服务注册中心的地址,地址和注册中心设置的地址一致。

spring.application.name=hello-service
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

5.同时启动服务注册中心以及服务提供方,可看到控制台打印信息,并在信息面板中看到注册信息

4、高可用注册中心

在微服务架构这样的分布式环境中,需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署
Eureka Server 的设计一开始就考虑了高可用问题,在Eureka的服务治理中,所有节点既是服务提供方,也是服务消费方,服务注册中心也一样。
Eureka Server 的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的相互同步,达到高可用的效果。

尝试搭建一个高可用服务注册中心的集群。构建一个双节点的服务注册中心集群。

1.创建 application-peer1.properties,作为peer1 服务中心的配置,并将serviceUrl指向peer2:

spring.application.name=eureka-server
server.port=1111

eureka.instance.hostname=peer1
eureka.client.service-url.defaultZone=http://peer2:1112/eureka/

2.创建 application-peer2.properties,作为peer2 服务中心的配置,并将serviceUrl指向peer1:

spring.application.name=eureka-server
server.port=1112

eureka.instance.hostname=peer2
eureka.client.service-url.defaultZone=http://peer1:1111/eureka/

3.通过spring.profiles.active 属性来分别启动peer1 和 peer2,不用启动主类
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

4.此时访问peer1的注册中心 http://localhost:1111/ 可以看到,registered-replicas 中已经有 peer2 节点的eureka-server了。同样的访问peer2 的注册中心 http://localhost:1112/ 也可以看到registered-replicas 中有 peer1 节点, 并且这些节点在可用分片(available-replicase)之中。

5.在设置了多节点的服务注册中心之后,服务提供方还需要做一些简单的配置才能将服务注册到Eureka Server 集群中。

server.port=2222
spring.application.name=hello-service

eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/

6.启动该服务,通过访问 http://localhost:1112/ 或者 http://localhost:1111/ 可以看到 hello-service 服务同时被注册到了peer1 和 peer2 上。
断开 peer1 ,由于 hello-service 同时也向peer2 上注册了,因此在peer2 上的其他服务依然能访问到hello-service,从而实现了服务注册中心的高可用

5、服务发现与消费

现在已经有了服务注册中心和服务提供者,下面就构建一个服务消费者,它主要完成两个目标,发现服务和消费服务。其中,服务发现的任务由Eureka客户端完成,而服务消费的任务由Ribbon完成。
Ribbon是一个基于HTTP和TCP的客户端负载均衡器

1.启动服务注册中心eureka-server以及两个hello-service服务。

2.创建一个Spring boot项目来实现服务消费者,在pom.xml中引入ribbon的依赖。注意2.0的区别。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

3.在主类中通过@EnableDiscoveryClient注解让该应用注册为Eureka客户端应用,以获取服务发现的能力,同时,在该主类中创建RestTemplate的Spring Bean实例,并通过@LoadBalanced 注解开启客户端负载均衡。

@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

4.创建ConsumerController类并实现/ribbon-consumer接口。在该接口中,通过上面创建的RestTemplate 来实现对HELLO-SERVICE 服务提供的 /hello 接口进行调用。此处的访问地址是服务名 HELLO-SERVICE ,而不是一个具体的地址,在服务治理框架中,这是一个重要特性。

@RestController
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "ribbon-consumer", method = RequestMethod.GET)
    public String helloConsumer(){
        return restTemplate.getForEntity("http://HELLO-SERVICE/index",
                String.class).getBody();
    }
}

5.同样在application.properties中配置Eureka服务注册中心的位置,注意端口不要冲突。

6.启动消费者应用,可以在Eureka信息面板中看到。

7.通过向消费者的/ribbon-consumer接口发起访问, 成功返回字符串 “hello world”。在消费者控制台中打印出服务列表情况。多发送几次请求,可以在服务提供方hello-service的控制台中看到一些打印信息,可以看出两个控制台基本是交替访问,实现了客户端的负载均衡。

二、Eureka详解

1、基础架构(核心三要素)

服务注册中心
Eureka提供的服务端,提供服务注册与发现的功能。
服务提供者
提供服务的应用,可以是spring boot应用,也可以是其他技术平台且遵循Eureka通信机制的应用。它将自己提供的服务注册到Eureka,以供其他应用发现。
服务消费者
消费者从服务注册中心获取服务列表,从而使消费者可以知道去何处调用其所需要的服。

2、服务治理机制

在这里插入图片描述
其中有几个重要元素:
“服务注册中心-1” 和 “服务注册中心-2”,他们互相注册组成高可用集群。
“服务提供者” 启动了两个实例,一个注册到“服务注册中心-1” 上,另外一个注册到 “服务注册中心-2” 上。
还有两个 “服务消费者” ,它们也都分别指向了一个注册中心。

根据上面的结构,可以详细了解从服务注册开始到服务调用,及各个元素所涉及的一些重要通信行为。

3、源码分析

暂略

三、配置详解

Eureka 客户端的配置主要分为以下两个方面:

服务注册相关的配置信息,包括服务注册中心的地址、服务获取的间隔时间、可用区域等。
服务实例相关的配置信息,包括服务实例的名称、IP地址、端口号、健康检查路径等。

1.服务注册类配置
可以查看 org.springframework.cloud.netflix.eureka.EurekaClientConfigBean 的源码,这些配置信息都已 eureka.client 为前缀。
指定注册中心-在配置文件中通过 eureka.client.service-url 实现。
当构建了高可用的服务注册中心集群时,可以为参数的value 值配置多个注册中心的地址(逗号分隔)

eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/

另外,为了服务注册中心的安全考虑,很多时候会为服务注册中心加入安全校验。这个时候,在配置serviceUrl时,需要在value 值的 URL 中加入响应的安全校验信息,比如: http://:@localhost:1111/eureka。其中为安全校验信息的用户名,为该用户的密码。

2.服务实例类配置
可以查看 org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 的源码,以 eureka.instance 为前缀。

3.元数据
元数据是 Eureka 客户端在向注册中心发送注册请求时,用来描述自身服务信息的对象,其中包含了一些标准化的元数据,比如服务名称、实例名称、实例IP、实例端口等用于服务治理的重要信息;以及一些用于负载均衡策略或是其他特殊用途的自定义元数据信息。
可以通过 eureka.instance. < properties > = 的格式对标准化元数据直接进行配置,< properties > 就是 EurekaInstanceConfigBean 对象中的成员变量名。对于自定义元数据,可以通过 eureka.instance.metadataMap.= 的格式来进行配置。

4.实例名配置
实例名,即 InstanceInfo 中的 instanceId 参数,它是区分同一服务中不同实例的唯一标识。
默认规则:
$ {spring.cloud.client.hostname}: $ {spring.application.name}: $ {spring.application.instance_id}: $ {server.port}

eureka.instance.instanceId= ${spring.application.name}: ${random.int}
通过上面的配置,利用应用名+随机数的方式来区分不同的实例,从而实现在同一个主机上,不指定端就能轻松启动多个实例的效果。

5.端点配置
statusPageUrlPath、healthCheckUrlPath、homePageUrl等,默认是spring-boot-actuator的端点。
例如通过eurka.instance.statusPageUrlPath=来配置需要的路径。

6.健康检查
默认通过心跳来保持实例的存活,但如果服务其他资源出问题,实例无法正常工作但心跳还在。
可以配置Eureka客户端的健康检查给spring-boot-actuator模块的health端点,实现全面的健康状态维护。

四、跨平台支持

Eureka的通信机制使用了HTTP的REST接口实现。所以其下微服务不限于Java开发。
默认Eureka使用Jersey和XStream配合JSON作为Server与Client之间的通信协议。也可以用自己的协议替代。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值