Eureka

Eureka简介

Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka 做了二次封装.Spring Cloud 的Eureka增加了Spring Boot风格的自动化配置,我们只需要简单引入依赖和注解配置就能让Spring Boot构建的微服务轻松的与Eureka服务治理体系进行整合.
Eureka核心内容:

  • 构建服务注册中心
  • 服务注册与服务发现
  • Eureka的基础架构
  • Eureka的服务治理机制
  • Eureka的配置

服务治理

服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册于发现.
微服务系统的缺陷:
在服务不多的时候,我们可以通过做一些静态配置来完成服务的调用.当系统功能越来越复杂,相应的微服务页不断的增多,我们的静态配置文件就越来越难以维护.如果通过手工维护的方式,也极易发生错误或者是命名冲突,同时对于静态内容的维护也消耗大量的人力.

服务注册

在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号,版本号,通讯协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单.
例如:
我们有两个提供提供服务的A的进程分别运行在192.168.0.100:8000和192.168.0.101:8000位置上,另外还有三个提供服务B的进程分别运行在192.168.0.100:9000,192.168.0.101:9000,
192.168.0.102:9000位置上.当这些进程均启动,并向注册中心注册自己的服务之后,注册中心就会维护一个类似下面的服务清单.另外注册中心还需要以心跳的方式去检测清单的服务是否可用,若不可用会从清单中清楚,达到故障辟出的效果.
image

服务发现

由于在服务治理框架下运作,服务间的调用不再通过制定具体的实例地址来实现.所以,服务调用方在调用服务提供方的接口的时候,并不知道知道实例的位置.因此,调用方需要向服务注册中心咨询服务,并获取所有服务的实例清单,以实现对具体实例的访问.
image

Netflix Eureka

Spring Cloud Eureka,使用Neftlix Eureka来实现服务注册与发现,它既包含了服务端组件,页包含了客户端组件,并且服务端与客户端都是用Java写的,所以主要适用于通过Java实现的分布式系统,或是JVM兼容语言构建的系统.由于Eureka服务端的服务治理机制提供了完备的RESTful API,所以也支持非Java语言构建的微服务应用纳入Eureka的服务治理体系中来.只是其他语言平台需要自己来实现Eureka的客户端程序.
Eureka服务端
Eureka服务端,我们也称为注册中心,与其他的注册中心一样支持高可用配置.它依托于强一致性提供良好的服务实例可用性,可以对应多种不同的故障场景.如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就会转入自我保护模式.它允许在分片故障期间继续提供服务的发现与注册,当故障分片恢复时,集群中的其他分片会把它们的状态再次同步回来.
Eureka客户端
Eureka客户端主要处理服务的注册与发现.客户端通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新服务租约,同时,也能从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态.

搭建服务注册中心

  • 创建一个基础的springboot工程,在pom.xml中添加必要依赖.
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wjh.cloud</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <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-test</artifactId>
            <scope>test</scope>
        </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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用程序对话.

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

}

在默认设置下,该服务注册中心也会将自己作为服务尝试注册自己,所以我们需要禁用他的客户端注册行为,只需要在appliaction.properties中增加如下配置:

server.port=1111

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
  • eureka.client.register-with-eureka:由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己.
  • eureka.client.fetch-registry:由于注册中心的职责是就是维护服务实例,并不需要去检索服务,所以也设置为false

启动应用并访问http://localhost:1111/,可以看到Eureka信息面板,其中instances currently with Eureka是空的,说明还没有注册任何服务.
image

注册服务提供者

# 依赖
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wjh.cloud</groupId>
    <artifactId>service_1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service_1</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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-test</artifactId>
            <scope>test</scope>
        </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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

编写接口,通过注入对象,在日志中打印服务的相关内容.

# controller 
@RestController
public class HelloController {

    private final Logger logger = Logger.getLogger(getClass());

    @Autowired
    private DiscoveryClient client;

    @GetMapping("/hello")
    public String index() {
        List<ServiceInstance> instances = client.getInstances("1");
        logger.info("我执行了");
        return "hello word";
    }
}

# 启动类 
@EnableDiscoveryClient
@SpringBootApplication
public class Service1Application {

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

}

# application.properties中的配置  
# 配置服务名
spring.application.name=hello-service 
# 设置服务的注册中心 
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/  

启动服务,查看Eureka信息面板状态
image


高可用注册中心

Eureka server 在设计的时候就考虑了高可用的问题,所有的节点即是服务的提供方也是服务的消费方,服务注册中心也不例外.

# 设置如下参数,让服务注册中心不注册自己  
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

Eureka的高可用实际上就是把自己作为服务在其他注册中心注册自己,这样就可以形成一组互相注册服务的注册中心,以实现服务清单的互相同步,达到高可用.

构建双节点服务注册中心集群
  • 创建application-peer1.properties,作为peer1服务中心的配置,并将serverUrl指向peer2.
spring.application.name=eureka-server
server.prot=1111  

eureka.instance.hostname=peer1
# 在peer2中注册自己的服务
eureka.client.server-url.defaultZone=http://peer2:1112/eureka/
  • 创建application-peer2.properties,作为peer2服务中心的配置,并将serviceUrl指向peer1.
spring.application.name=eureka-server
server.prot=1112  

eureka.instance.hostname=peer2
# 在peer2中注册自己的服务
eureka.client.server-url.defaultZone=http://peer1:1111/eureka/
  • 在/etc/hosts文件中添加对peer1和peer2的转换,让上面配置的host形式的serverUrl能在本地访问到,Windows系统的路径为c:\windows\System32\drivers\etc\hosts.
127.0.0.1 peer1  
127.0.0.1 peer2
  • 通过spring.profiles.active属性分别启动peer1和peer2.
java -jar xxx.jar --spring.profiles.active=peer1
java -jar xxx.jar --spring.profiles.active=peer2
  • 指定多个注册中心
eureka.client.server-url.defaultZone=http://peer1:1111/eureka/,.....

如果我们不想使用主机名来定义注册中心的地址,也可以使用IP的形式

#  使用IP形式定义注册中心
eureka.instance.prefer-ip-address=true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值