本系列持续更新中

SpringCloud微服务框架01-SpringCloud简介

SpringCloud微服务框架02-Eureka服务注册与发现

SpringCloud微服务框架03 - Ribbon负载均衡

SpringCloud微服务框架04 - Config统一配置中心

文章中设计到的项目源码,会逐步整理到github上。github除了本系列文章设计到的源码信息,还有Spring Cloud整合的项目框架。有同样正在学习Spring Cloud的小伙伴可以加我一起学习交流。

github地址:https://github.com/hack-feng/maple-cloud

1、Eureka简介

Eureka是Netflix出品的用于实现服务注册和发现的工具。Spring Cloud集成了Eureka,并提供了开箱即用的支持。Netflix在设计Eureka时遵循着A(可用性)P(分区容错性)原则,它是基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,功能类似于Dubbo的注册中心Zookeeper。Zookeeper更着重于C(一致性)P(分区容错性)。

2、实现原理

Eureka采用C-S的设计架构,即包括了Eureka Server(服务端),Eureka Client(客户端)。

  1. Eureka Server提供服务注册,各个节点启动后,在Eureka Server中进行注册
  2. Eureka Client是一个Java客户端,用于和服务端进行交互,同时客户端也是一个内置的默认使用轮询负载均衡算法的负载均衡器。在应用启动后,会向Eureka Server发送心跳(默认30s)。如果Eureka Server在多个心跳周期内没有接受到某个节点的心跳,Eureka Server将会从服务注册表中将这个服务取出(默认90s)。

3、SpringCloud Eureka的使用步骤

3.1 创建Eureka service注册中心

创建一个SpringBoot项目:maple-eureka-service

导入pom.xml需要的依赖

<!-- 引入Eureka Server,用于注册Eureka服务 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
        
<!-- Eureka注册中心加入权限 非必须,如果不许登录,可以不引入依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>


<!-- 和dependencies同级,不加以下部分,引入spring-cloud-starter-eureka-server会不成功 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

配置application.properties文件

# 服务注册中心端口号
server.port=1111

# 项目名
spring.application.name=eureka-server

# 注册中心主机名
eureka.instance.hostname=localhost

# false表示不向注册中心注册自己。
eureka.client.register-with-eureka=false

# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false

# 单机设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

# Eureka高复用时设置其他的Eureka之间通信
#eureka.client.serviceUrl.defaultZone=http://backup1:1112/eureka/,http://backup2:1113/eureka/

# Eureka服务端关闭心跳连接测试
#eureka.server.enable-self-preservation=false

# 是否启用安全策略 security.basic.enabled为true时表示开启
security.basic.enabled=true
security.user.name=admin
security.user.password=admin123

这里只做单机的Eureka,高可用的集群环境在后面的文章详细介绍。

配置主服务类文件MapleEurekaServiceApplication.java

添加 Eureka 服务声明注解@EnableEurekaServer

@EnableEurekaServer
@SpringBootApplication
public class MapleEurekaServiceApplication {

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

访问Eureck服务注册中心

在浏览器输入http://localhost:1111

显示登录页面,如果无需登录,则可以设置application.properties文件里属性rity.basic.enabled=false

登录之后显示以下页面,表示Eureka注册中心服务启动成功。

 

3.2 创建提供服务者的Eureka Client

创建springBoot项目:maple-eureka-provider

导入pom.xml需要的依赖

<!-- 将微服务provider侧注册进eureka -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
        
<!-- actuator监控信息完善 -->
<dependency>
     <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- 和dependencies同级,不加以下部分,引入spring-cloud-starter-eureka-server会不成功 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

配置application.properties文件

server.port=8087
spring.application.name=maple-provider

#如果注册中心服务不需要登录
#eureka.client.service-url.defaultZone=http://master:1111/eureka/
#如果注册中心服务需要登录则:http://user:password@localhost:8761/eureka
eureka.client.service-url.defaultZone=http://admin:admin123@master:1111/eureka/

配置主服务类文件MapleEurekaProviderApplication.java

添加 Eureka 客户端声明注解@EnableDiscoveryClient或@EnableEurekaClient

spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等)

@EnableDiscoveryClient基于spring-cloud-commons;

@EnableEurekaClient基于spring-cloud-netflix

注解@EnableEurekaClient上有@EnableDiscoveryClient注解,可以说基本就是EnableEurekaClient有@EnableDiscoveryClient的功能,@EnableEurekaClient注解就是一种方便使用eureka的注解而已,可以说使用其他的注册中心后,都可以使用@EnableDiscoveryClient注解

但是使用@EnableEurekaClient的情景,就是在服务采用eureka作为注册中心的时候,使用场景较为单一。

@EnableDiscoveryClient
@SpringBootApplication
public class MapleEurekaProviderApplication {

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

创建测试服务ProviderDemoController.java

@RestController
@RequestMapping("/demo")
public class ProviderDemoController {

	@RequestMapping(value = "/providerDemo")
	@ResponseBody
	public String providerDemo(){
		return "这是项目《maple-eureka-provider》ProviderDemo的数据";
	}
}

3.3 创建服务消费者的Eureka Client

创建springBoot项目:maple-eureka-client

导入pom.xml需要的依赖

<!-- 将微服务provider侧注册进eureka -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- 负载均衡 -->   
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

<!-- 和dependencies同级,不加以下部分,引入spring-cloud-starter-eureka-server会不成功 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

配置application.properties文件

server.port=8065
spring.application.name=maple-client

#如果注册中心服务不需要登录
#eureka.client.service-url.defaultZone=http://master:1111/eureka/
#如果注册中心服务需要登录则:http://user:password@localhost:8761/eureka
eureka.client.service-url.defaultZone=http://admin:admin123@master:1111/eureka/

配置主服务类文件MapleEurekaClientApplication .java

添加 Eureka 客户端声明注解@EnableDiscoveryClient

@EnableDiscoveryClient
@SpringBootApplication
public class MapleEurekaClientApplication {

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

创建测试服务DemoController.java

@RestController
@RequestMapping("/demo")
public class DemoController {
	
	private String PROVIDER_URL = "http://MAPLE-PROVIDER";
	@Autowired
	private RestTemplate restTemplate; 
	
	@RequestMapping(value = "/test")
	public @ResponseBody String test(){
		return restTemplate.getForEntity(PROVIDER_URL + "/demo/providerDemo" , String.class).getBody();
	}
}

这里需要配置RestTemplate

@Configuration
public class TemplateConfig {

	@Bean
	@LoadBalanced	//负载均衡
	public RestTemplate restTemplate(ClientHttpRequestFactory factory){
		return new RestTemplate(factory);
	}
	
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(15000);//ms
        factory.setConnectTimeout(15000);//ms
        return factory;
    } 
}

@LoadBalanced注解参考

SpringCloud微服务框架03 - Ribbon负载均衡一文

启动项目:maple-eureka-provider和maple-eureka-client

此时,Eureka的注册中心就可以看到注册的服务了。

在浏览器上访问http://127.0.0.1:8065/demo/test.do显示页面:

此时,Eureka服务和发现已经搭建好了。

4、Eureka-HA(高可用) 机制

现在已经成功的实现了一个 Eureka 服务器,但是现在属于单节点的服务运行过程,如果说现在单节点的 Eureka 出现了错误, 导致无法使用,那么对于所有的微服务的架构就将出现整体的瘫痪,就需要进行 Eureka 集群搭建,同时利用集群可以有效的实现 HA 的处理机制,如果要进行集群的搭建一定要选择两台或以上的电脑完成,而基本的流程如下:

配置hosts文件

127.0.0.1 master
127.0.0.1 backup1
127.0.0.1 backup2

修改maple-eureka-service项目application.properties文件,并创建maple-eureka-service2、maple-eureka-service项目。

application.properties文件分别如下

# maple-eureka-service-----------------------------
# 服务注册中心端口号
server.port=1111

# 项目名
spring.application.name=eureka-server

#注册中心主机名
eureka.instance.hostname=master

# false表示不向注册中心注册自己。
eureka.client.register-with-eureka=false

# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false

# Eureka高复用时设置其他的Eureka之间通信
eureka.client.serviceUrl.defaultZone=http://backup1:1112/eureka/,http://backup2:1113/eureka/



# maple-eureka-service2-----------------------------
#服务注册中心端口号
server.port=1112
spring.application.name=eureka-server

#注册中心主机名
eureka.instance.hostname=backup1

#服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http://master:1111/eureka/,http://backup2:1113/eureka/



# maple-eureka-service3-----------------------------
#服务注册中心端口号
server.port=1113
spring.application.name=eureka-server

#注册中心主机名
eureka.instance.hostname=backup2

#服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http://master:1111/eureka/,http://backup2:1112/eureka/

修改maple-eureka-client、maple-eureka-provider项目的application.properties文件eureka.client.service-url.defaultZon属性

eureka.client.service-url.defaultZone=http://master:1111/eureka/,http://backup1:1112/eureka/,http://backup2:1113/eureka/

启动所有的 eureka 服务,而后进入到每一个服务的后台去观察运行的副本效果:

此时访问http://master:1111,显示如下:

参考:

EureKa:服务注册与发现

SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐