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

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

本系列持续更新中


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、实现原理



20180707224436734.png


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


20190404134822591.png

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


20190404135041202.png

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的注册中心就可以看到注册的服务了。


20190404144406161.png


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


20190404145419423.png



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


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


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


2019040415091128.png


配置hosts文件

1. 127.0.0.1 master
2. 127.0.0.1 backup1
3. 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,显示如下:


20190404152529809.png


参考:


EureKa:服务注册与发现

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
11月前
|
负载均衡 算法 Java
【SpringCloud(4)】OpenFeign客户端:OpenFeign服务绑定;调用服务接口;Feign和OpenFeign
Feign是一个WebService客户端。使用Feign能让编写WebService客户端更加简单。 它的使用方法是定义一个服务接口然后再上面添加注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,十七支持了SpringMVC标准注解和HttpMessageConverters。 Feign可用于Eureka和Ribbon组合使用以支持负载均衡
1062 139
|
11月前
|
算法 Java 微服务
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
微服务架构是What?? 微服务架构是一种架构模式,它提出将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务允许在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作(通常是Http协议的RESTful API或RPC协议)。 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建
792 126
|
11月前
|
负载均衡 算法 Java
【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
1. 什么是服务治理? SpringCloud封装了Netfix开发的Eureka模块来实现服务治理 在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
542 0
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1572 3
|
11月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
12月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
674 1
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
1228 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
956 0
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
1138 0