Netflix Eureka教程

Eureka

Eureka 本身为 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责实现微服务架构中的服务治理功能。

Eureka 是一个基于 REST 的服务,并且提供了基于 Java 的客户端组件,能够非常方便地将服务注册到 Spring Cloud Eureka 中进行统一管理。

同类产品还有Consul、Etcd、Zookeeper等.

结构

Eureka结构分为3大模块.

  • Eureka Server简称服务注册中心, 提供服务注册和发现
  • Service Provider 简称服务提供者,将自身服务注册到Eureka,从而使服务消费方能够找到
  • Service Consumer 简称服务消费者,从Eureka获取注册服务列表,从而能够消费服务

服务注册中心实时管理服务提供者和服务消费者,服务消费者可以调用服务提供者的API.

Eureka 包括两个服务模块:Service Provider(服务提供者)和Service Consumer(服务消费方)。

CAP定理

分布式系统,正变得越来越重要,大型网站几乎都是分布式的。

而分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。

可以参考:http://www.ruanyifeng.com/blog/2018/07/cap.html

其中CAP代表:

  • P:Partition tolerance,网络分区容错。类似多机房部署,保证服务稳定性。
  • A: Availability,可用性。
  • C:Consistency ,一致性。

CAP三个属性对于分布式系统不同同时做到,最多只能做到2方面,如AP/CP/AC。

在这方面上,Euere是AP,相似产品Zookeeper是CP.

部署Euere Server项目

Euere Server又为服务注册中心,用于统一微服务项目,提供服务注册和发现等管理功能.

1.向其一个Maven项目添加Eureka Server依赖

<!-- Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.6.RELEASE</version>
    <relativePath />
</parent>
<dependencies>
    <!-- eureka -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>
<!-- Spring Cloud -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.SpringApplication启动项上加入**@EnableEurekaServer**注释,来标识该服务为Eureka Server.

3.修改Springboot配置文件,添加Eureka配置

spring:
  application:
    name: eureka-server-cluster1
server:
  port: 876
eureka:
  client:
    # 由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
    register-with-eureka: false
    # 由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
    fetch-registry: false

4.为其Eureka Server-服务注册中心开启密码认证

​ 新增spring-security依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

​ 在Springboot配置文件添加用户信息

spring:
  security:
    user:
      #用户名
      name: root
      #密码
      password: 123456

​ 增加 Security 配置类

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 关闭csrf
        http.csrf().disable();
        // 支持httpBasic
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

5.运行项目,访问路径根目录.便会看到 Eureka 提供的 Web 控制台,上面显示着服务提供者服务消费者的相关信息。

部署Service Provider项目

Service Provider(服务提供者)如其名一样,主要实现功能为业务实现的项目,输出业务API.

Service Provider和Eureka Server目录类似, 不同点在于:

  • Eureka Client启动类上使用@EnableDiscoveryClient 注释,标识该服务为Euraka Client
  • 配置文件,需要指定Euraka Server地址和当前服务注册时的名称。

1.Maven配置

<!-- Spring Boot -->
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath />
 </parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- eureka -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

<!-- Spring Cloud -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

这儿和Server项目大体相同,注意,Server用的是spring-cloud-starter-netflix-eureka-server包,而Client用的是spring-cloud-starter-netflix-eureka-client包

2.Application启动类添加**@EnableDiscoveryClient**注释,识该项目为Eureka Client项目.

3.配置Springboot配置文件,声明注册内容

spring:
  application:
    name: eureka-client-user-service

eureka:
  client:
    serviceUrl:
      #若注册中心服务开启Security安全认证必须在前加入验证消息
      defaultZone: http://root:123456@localhost:8761/eureka/
    instance:
      # 定义该项目实例ID格式
      instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

4.配置Controller类,使用RestContoll实现对于业务功能.

@RestController
public class UserController {
    @GetMapping("/user/hello")
    public String hello() {
        return "hello222";
    }
}

5.运行项目

DiscoveryClient_EUREKA-CLIENT-USER-SERVICE/eureka-client-user-service:192.168.0.190:8082 - registration status: 204

控制台输出registration status: 204表示该项目向服务注册中心注册成功.

返回服务注册中心页面,便可显示该项目id以及状态.

部署 Servcie Customer项目

Service Consumer(服务消费方):主要实现功能为用户调用服务提供者项目的API.

1.它的工程目录和Servie Providerder一模一样的,配置方法见上配置Service Provider项目

2.创建一个RestTemplate的配置类.

@Configuration
public class BeanConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率。

其中@LoadBalanced这个注解会自动构造 LoadBalancerClient 接口的实现类并注册到 Spring 容器中.从而引用时不需要写实际IP地址,只需使用注册时的名称.

3.为了从Euraka Server中获取服务地址信息,在工程中添加一个Controler

@RestController
public class ArticleController {
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/article/callHello2")
    public String callHello2() {
        return restTemplate.getForObject("http://eureka-client-user-service/user/hello", String.class);
    }
}    

4.运行项目

​ 成功后项目自动注册到服务注册中心.运行该项目执行Controller中的路径,自动返回Service Provider中的对应API返回值,相当于反射调用.

最终实现图例