上手spring cloud(一)Eureka服务注册与发现

42次阅读

共计 4169 个字符,预计需要花费 11 分钟才能阅读完成。

spring cloud 面向开发人员,对分布式系统从编程模型上提供了强大的支持。可以说是分布式系统解决方案的全家桶,极大地降低了开发与构建分布式系统的门槛。
包括了诸如下列功能:

Eureka 服务注册发现
统一配置中心
Spring Cloud Stream 异步调用
Zuul 服务网关
Hystrix 服务降级容错
服务调用跟踪

Netflix 是一家互联网流媒体播放商,美国视频巨头,最近买下《流浪地球》,并在 190 多个国家播出的就是它了。随着 Netflix 转型为一家云计算公司,也开始积极参与开源项目。Netflix OSS(Open Source)就是由 Netflix 公司开发的框架,解决上了规模之后的分布式系统可能出现的一些问题。spring cloud 基于 spring boot,为 spring boot 提供 Netflix OSS 的集成。
这段时间对 spring cloud 进行了学习总结,留下点什么,好让网友上手 spring cloud 时少躺坑。
我用的版本如下:

spring-boot 2.0.2.RELEASE
spring-cloud Finchley.RELEASE

spring boot 不同版本之间在配置和依赖上会有差异,强烈建议创建工程后先把 spring boot 和 spring cloud 的版本依赖调整成与本篇一致,快速上手少躺坑。
上手完后,你可以尝试升到最新版本,官方 spring-cloud 页(进去后拉到最下面)提供了 spring-cloud 与 spring-boot 版本匹配表。升级完后建议重新测试一下相关功能。
Eureka 服务注册与发现
Eureka Server 服务注册中心
IntelliJ IDEA(我是 2018.2.5 的版本),创建工程 eureka-server:
File -> New->Product… -> 选择 Spring Initializr -> Project SDK 用 1.8 -> Next -> 输入 Product Metadata -> Next -> 选择 Cloud Discovery -> 选择 Eureka Server
注意创建工程后调整 spring boot 和 spring cloud 的版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!– lookup parent from repository –>
</parent>

<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
由于选择了 Eureka Server,创建成功后 pom.xml 里已经帮你引入了以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
我们给启动类加上注解 @EnableEurekaServer:
package com.hicoview.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

}
配置 application.yml(习惯 yml 风格的同学,把 application.properties 直接改过来):
eureka:
client:
# 默认 eureka 服务注册中心会将自身作为客户端来尝试注册,所以我们需要禁用它的客户端注册行为
register-with-eureka: false
# 默认 30 秒会更新客户端注册上来的服务清单,启动时就不获取了,不然启动会有报错,虽然不影响
fetch-registry: false
server:
# 关闭注册中心自我保护(默认是 true,生产环境不建议关闭,去掉该配置项或改成 true)
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8761
服务注册中心搞定,启动成功后访问 http://localhost:8761,可以看到注册中心页面:

Eureka Server 高可用
只要启动多个注册中心进程即可,多个之间,两两注册到对方。比如,8761 端口启动一个 eueka 服务端,注册到 8762:
eureka:
client:
service-url:
# 提供其他注册中心的地址,注册中心将自身以客户端注册的方式注册到其他注册中心去
defaultZone: http://localhost:8762/eureka/
register-with-eureka: false
fetch-registry: false
server:
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8761
8762 端口启动一个 eueka 服务端,注册到 8761:
eureka:
client:
service-url:
# 提供其他注册中心的地址,注册中心将自身以客户端注册的方式注册到其他注册中心去
defaultZone: http://localhost:8761/eureka/
register-with-eureka: false
fetch-registry: false
server:
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8762
访问 http://localhost:8761,可以看到 8761 这里有了 8762 的副本:
访问 http://localhost:8762,也是一样,你可以试试。
接下来我们用 Eureka Client 来验证下服务的注册。
Eureka Client
实际上充当 Eureka Client 角色应该是各种业务的微服务工程了,这里为了快速演示一下服务注册,临时先搞个无意义的 client 工程作为 Eureka Client 示范。
创建 Eureka Client 工程 eureka-client:
File -> New->Product… -> 选择 Spring Initializr -> Project SDK 用 1.8 -> Next -> 输入 Product Metadata -> Next -> 选择 Cloud Discovery -> 选择 Eureka Discovery
注意每次创建工程后的第一件事,改 spring-boot 和 spring-cloud 的版本,不再赘述
由于选择了 Eureka Discovery,创建成功后 pom.xml 里已经帮你引入了以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
修改 pom.xml,还要加入 web 依赖,不然无法启动成功:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动类加注解 @EnableDiscoveryClient:
package com.hicoview.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {

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

}
配置 application.yml:
eureka:
client:
service-url:
# 注册中心地址,如果注册中心是高可用,那么这里后面可以添加多个地址,逗号分开
defaultZone: http://localhost:8761/eureka/
#defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
spring:
application:
name: client
启动成后,访问注册中心 http://localhost:8761:
完成了 Eureka 服务注册示例,接下来我们简单模拟一个业务场景,示范微服务之间的服务调用。

正文完
 0