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

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 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 服务打包部署)

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
1天前
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。
|
1天前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
3天前
|
负载均衡 Java Nacos
EureKa详解:微服务发现与注册的利器
EureKa详解:微服务发现与注册的利器
|
3天前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
12天前
|
前端开发 Java UED
"揭秘!如何以戏剧性姿态,利用SpringCloud铸就无懈可击的异常处理铁壁,让你的微服务架构稳如泰山,震撼业界!"
【8月更文挑战第8天】随着Spring Cloud在微服务架构中的广泛应用,统一异常处理成为确保系统稳定性和提升用户体验的关键。传统方式在各服务中单独处理异常导致代码冗余且不一致。因此,采用Spring Cloud封装统一异常处理机制变得尤为重要:它减少了冗余代码,提升了异常处理的一致性和系统的可维护性,并通过统一错误响应格式优化了用户体验。实现这一机制可通过定义全局异常处理器、自定义业务异常并在服务中适当抛出这些异常来完成。这种方式遵循了微服务设计中的“服务治理”和“契约先行”原则,为构建健壮的微服务系统打下了基础。
25 1
|
1天前
|
Java 应用服务中间件 数据库
SpringCloud:服务保护和分布式事务详解
SpringCloud:服务保护和分布式事务详解
14 0
|
3天前
|
缓存 Java Maven
SpringCloud基于Eureka的服务治理架构搭建与测试:从服务提供者到消费者的完整流程
Spring Cloud微服务框架中的Eureka是一个用于服务发现和注册的基础组件,它基于RESTful风格,为微服务架构提供了关键的服务注册与发现功能。以下是对Eureka的详细解析和搭建举例。
12 0
|
3天前
|
Java 数据库连接 Nacos
SpringCloud微服务配置管理、配置热更新
SpringCloud微服务配置管理、配置热更新
14 0
|
4天前
|
存储 缓存 Java
Eureka原理与实践:深入探索微服务架构的核心组件
在微服务架构日益盛行的今天,服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka,作为Netflix开源的服务注册与发现框架,凭借其简单、健壮的特性,在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理,并通过实践案例展示其在实际项目中的应用,以期为开发者提供一个高端、深入的视角。
11 0