@Spring Cloud | NO.1 - 服务的注册与发现 [Eureka]

什么是Spring Cloud

Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调致使了样板模式, 使用Spring Cloud开发人员能够快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员本身的笔记本电脑,裸机数据中心,以及Cloud Foundry等托管平台。html

以上内容为官方直译

版本说明

Spring Boot 2.0.1.RELEASE
Spring Cloud Finchley RC1
SpringCloud项目基于SpringBoot,因此学习SpringCloud以前须要对SpringBoot有必定的了解。

服务的注册与发现

服务发现是基于微服务架构的关键原则之一。Spring Cloud Netflix组件上的Eureka是一个服务注册与发现的模块(包含客户端和服务端)。能够将服务器配置和部署为高可用性,每一个服务器将注册服务的状态复制到其余服务器。Eureka是一个高可用的组件,它没有后端缓存,每个实例注册以后须要向注册中心发送心跳(所以能够在内存中完成)。java

Eureka - 服务注册中心

1. pom.xml中引入相关Maven依赖web

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

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

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

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
注意: Eureka Server引入的Maven依赖中 artifactId有变更, SpringBoot2.0以前的版本为 spring-cloud-starter-eureka-server

2. SpringBoot启动器添加注解spring

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

3. application.yml配置后端

spring:
  application:
    name: eureka-server
server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
上述配置文件描述一个单节点注册中心,默认状况下Eureka Server也是一个Eureka Client,可经过 eureka.client.registerWithEureka:falsefetchRegistry:false来代表本身是一个Eureka Server。默认这两个属性值为 true

至此Eureka Server服务注册中心配置完毕。缓存

4. 运行概览图安全

启动工程,访问 http://localhost:8761

Eureka Server 服务注册中心

由于没有服务注册,因此显示 No Instances Available

Eureka - 服务提供者

1. pom.xml中引入相关Maven依赖服务器

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

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

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

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
注意: Eureka Client引入的Maven依赖中 artifactId有变更, SpringBoot2.0以前的版本为 spring-cloud-starter-eureka

2. SpringBoot启动器添加注解架构

@EnableEurekaClient
@SpringBootApplication
@RestController
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
    
    @Value("${server.port}")
    String port;
    @RequestMapping("/hi")
    public String home(@RequestParam String name) {
        return "hi "+name+",i am from port:" +port;
    }
}
在这个例子中,咱们明确地使用 @EnableEurekaClient,但只有 Eureka可用,你也可使用 @EnableDiscoveryClient

3. application.yml配置app

spring:
  application:
    name: service-hi
server:
  port: 8762
eureka:
  client:
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
management:
  endpoints:
    web:
      exposure:
        include: "*"
Eureka Client提供者只须要注明注册自身服务的服务注册中心的地址便可。当客户端注册Eureka Server时,它提供关于自身的元数据,例如主机和端口,健康指示符URL,主页等。Eureka从属于服务的每一个实例接收心跳消息。若是心跳失败超过可配置的时间表,则一般将该实例从注册表中删除。

其中defaultZone是一个魔术字符串后备值,为任何不表示首选项的客户端提供服务URL(即它是有用的默认值)。

须要指明spring.application.name,这个很重要,这在之后的服务与服务之间相互调用通常都是根据这个name 。

注意: SpringBoot2.0以后大部分endpoints不会被暴露,上面咱们暴露了全部endpoints,如应用到生产环境,考虑到安全问题,对于Actuator的Endpoints请根据须要进行配置

至此Eureka Client服务提供者配置完毕。

4. 运行概览图

启动工程,访问 http://localhost:8761

Eureka Server 服务提供者注册到服务注册中心

服务名为SERVICE-HI已经注册到注册中心。

打开 http://localhost:8762/hi?name... ,返回以下结果:

hi forezp,i am from port:8762

附加说明

  1. 本文参考资料
相关文章
相关标签/搜索