第一篇:注册中心Eureka

什么是注册中心?
注册中心管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,有了注册中心之后,任何一个服务都不在是直连的,都需要通过注册中心去调用。
由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载;监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。

什么是Eureka,有什么用?

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service RegistryService Discovery实现。也是springcloud体系中最重要最核心的组件之一。
Eureka 是一个基于 REST 的服务,主要在 AWS 云中使用, 定位服务来进行中间层服务器的负载均衡和故障转移。
Eureka 采用了 C-S的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。

如何创建服务注册中心

首先创建一个空的Maven项目,做为父工程,一直下一步下一步至完成,如下图

创建好后删除src文件,因为是用它来做父工程

修改pom.xml文件,加载依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.niuben</groupId>
    <artifactId>spring-cloud</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <!--父依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>

    <!--属性定义-->
    <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.RELEASE</spring-cloud.version>
    </properties>

    <!--spring-boot test依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--版本管理-->
    <dependencyManagement>
        <dependencies>
            <!--spring-cloud依赖-->
            <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>

    <!--Maven打包插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

parent: 父级依赖项目,这里能看到依赖的父级的springboot的版本

properties: 当前配置文件一些配置,可以看到Java的版本是1.8,springcloud的版本是Finchley.RELEASE

dependencies: 当前项目依赖的组件

dependencyManagement: 这里是声明依赖,并不实现引入,如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本

build: 在build中声明了当前使用的插件,spring-boot-maven-plugin,主要功能:能够将Spring Boot应用打包为可执行的jar或war文件

然后在创建2个model,eureka-server和service-client,创建过程同创建父工程

eureka-server项目

创建完eureka-server后,引入父工程pom文件,同时引入spring-cloud-starter-netflix-eureka-server依赖

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

编写配置文件application.yml

server:
  port: 8761
spring:
  application:
    name: eurka-server
eureka:
 server:
  enable-self-preservation: false
instance: hostname: localhost client: registerWithEureka:
false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

enable-self-preservation: 防止由于Eureka的机制导致Client被错误显示在线,仅在开发环境使用,生产环境需缓存此信息,防止因网络波动导致服务频繁上下线

register-with-eureka: 不想注册中心注册自己

然后在启动类上开启eureka注解@EnableEurekaServer,表明是一个EurekaServer

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

此时打开浏览器,输入http://localhost:8761,界面如下

因为没有注册服务所以不可能有服务被发现

service-client项目

创建完eureka-client后,引入父工程pom文件,同时引入spring-cloud-starter-netflix-eureka-client依赖

<!--Eureka 客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--Web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

编写配置文件application.yml

server:
  port: 8762
spring:
  application:
    name: eureka-client
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

配置文件中的spring.application.name很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 

然后在启动类上开启@EnableEurekaClient注解,表明自己是一个eureka client

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

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

}

编写一个controller层,创建TestEurekaClient类

@RestController
public class TestEurekaClient {

    @Value("${server.port}")
    String port;

    @RequestMapping("/test")
    public String home(@RequestParam(value = "name", defaultValue = "niuben") String name) {
        return "hi " + name + " ,现在的端口是:" + port;
    }
}

依次启动eureka server,eureka-client

打开http://localhost:8761,会发现已经发现服务了

这时打开 http://localhost:8762/test?name=haha ,你会在浏览器上看到 

hi haha ,现在的端口是:8762

小知识

@EnableDiscoveryClient和@EnableEurekaClient

共同点:都是能够让注册中心能够发现,扫描到改服务

不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心

 

源码下载:https://gitee.com/niugit_admin/spring-cloud-finchley

原文地址:https://www.cnblogs.com/niudaben/p/12427922.html