文档章节

(一)基于Spring Cloud Eureka服务注册于发现,以及部分浅析

Twelve_ZX
 Twelve_ZX
发布于 2017/04/05 16:53
字数 1617
阅读 158
收藏 3

Spring Cloud 是一套分布式体系,提供比较灵活的配置与使用。功能十分丰富。

Eureka Server会提供服务注册服务,各个服务节点启动后,会在Eureka Server中进行注册,这样Eureka Server中就有了所有服务节点的信息,并且Eureka有监控页面,可以在页面中直观的看到所有注册的服务的情况。同时Eureka有心跳机制,当某个节点服务在规定时间内没有发送心跳信号时,Eureka会从服务注册表中把这个服务节点移除。Eureka还提供了客户端缓存的机制,即使所有的Eureka Server都挂掉,客户端仍可以利用缓存中的信息调用服务节点的服务。Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。( Ribbon会在下一篇文章讲解)
Eureka通过心跳检测、健康检查、客户端缓存等机制,保证了系统具有高可用和灵活性。

本篇文章,就Spring Cloud Eureka的服务注册,与服务管理做一个浅析,以及搭建的介绍

如图所示,我们有一个Eureka Server服务,我们的每个应用服务都部署在Client上,我们部署之后,通过Eureka将自身注册到Service上,这样以后应用的负载均衡以及获取配置,都可以通过Service获取和被调度。

Spring Service的Pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.zx</groupId>
  <artifactId>SpringCloudOne</artifactId>
  <version>0.0.1-SNAPSHOT</version>
	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>   <!--配合spring cloud版本-->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>   
        <!--设置字符编码及java版本-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.7</java.version>
    </properties>

    <dependencies>
        <!--增加eureka-server的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!--用于测试的,本例可省略-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--依赖管理,用于管理spring-cloud的依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-parent</artifactId>
                <version>Brixton.SR3</version>   <!--官网为Angel.SR4版本,但是我使用的时候总是报错-->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <!--使用该插件打包-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>   
</project>

然后再创建入口class (a[pplication.class)

@EnableEurekaServer//启动Eureka服务
@SpringBootApplication
public class ApplicationServer implements EmbeddedServletContainerCustomizer {
    public static void main(String[] args) {
    	//通过注解加载Bean
    	SpringApplication.run(ApplicationServer.class, args);
//    	从Spring配置文件加载Bean
//    	SpringApplication.run("classpath:applicationContext.xml", args);
//    	SpringApplication app=new SpringApplication(Application.class);
//    	app.run(args);
    }

	public void customize(ConfigurableEmbeddedServletContainer container) {
		// TODO Auto-generated method stub
		container.setPort(8761);
	}
}

添加application.yml 或者使用properties文件也行。不强制

注意,Eureka配置文件离得server-port应该和你的服务所在端口保持一致,官方建议使用8761

server:
  port: 8761     #指定服务端口
eureka:
  client:
    registerWithEureka: false  #是否将eureka自身作为应用注册到eureka注册中心
    fetchRegistry: false       
    #为true时,可以启动,但报异常:Cannot execute request on any known server

之后可以启动服务。访问localhost:8761,就能看到Eureka默认首页

客户端配置:

pom文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.zx</groupId>
  <artifactId>SpringCloudClient</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.5.RELEASE</version>
    <relativePath/>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.7</java.version>
  </properties>

  <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-parent</artifactId>
            <version>Brixton.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
      <!--此处是差异所在-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
       <!-- 客户端负载均衡jar包 -->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
      </dependency>
      <!-- 跨服务请求 包 -->
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
<!--      <dependency>-->
<!--            <groupId>org.apache.httpcomponents</groupId>-->
<!--            <artifactId>httpclient</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.netflix.feign</groupId>-->
<!--            <artifactId>feign-httpclient</artifactId>-->
<!--            <version>${feign-httpclient}</version>-->
<!--        </dependency>-->
  </dependencies>

  <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
  </build>

</project>

然后创建入口类:

@EnableDiscoveryClient //允许服务被发现
@SpringBootApplication
@EnableFeignClients //允许服务之间的调用(后面会说)
public class ApplicationClientOne {
//public class Application implements EmbeddedServletContainerCustomizer {
    public static void main(String[] args) {
    	//通过注解加载Bean
    	SpringApplication.run(ApplicationClientOne.class, args);
//    	从Spring配置文件加载Bean
//    	SpringApplication.run("classpath:applicationContext.xml", args);
//    	SpringApplication app=new SpringApplication(Application.class);
//    	app.run(args);
    }

//	public void customize(ConfigurableEmbeddedServletContainer container) {
//		// TODO Auto-generated method stub
//		container.setPort(9000);
//	}
	
}
@RestController
class ServiceInstanceRestController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/service-instances/{applicationName}")
    public List<ServiceInstance> serviceInstancesByApplicationName(@PathVariable String applicationName) {
        return this.discoveryClient.getInstances(applicationName);
    }
}

这个类下面我定义了一个 方法serviceInstancesByApplicationName 这个方法通过应用的名称,获取相关信息。

返回参数如下:

[{"metadata":{},"uri":"http://PMOMIS-PC.dayang.com:8080","secure":false,"serviceId":"ONE-CLOUD-CLIENT","instanceInfo":{"instanceId":"PMOMIS-PC.dayang.com:One-cloud-client:8080","app":"ONE-CLOUD-CLIENT","appGroupName":null,"ipAddr":"192.168.6.23","sid":"na","homePageUrl":"http://PMOMIS-PC.dayang.com:8080/","statusPageUrl":"http://PMOMIS-PC.dayang.com:8080/info","healthCheckUrl":"http://PMOMIS-PC.dayang.com:8080/health","secureHealthCheckUrl":null,"vipAddress":"One-cloud-client","secureVipAddress":"One-cloud-client","countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"hostName":"PMOMIS-PC.dayang.com","status":"UP","leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"registrationTimestamp":1491381396464,"lastRenewalTimestamp":1491381396464,"evictionTimestamp":0,"serviceUpTimestamp":1491381395840},"isCoordinatingDiscoveryServer":false,"metadata":{},"lastUpdatedTimestamp":1491381396464,"lastDirtyTimestamp":1491381395750,"actionType":"ADDED","asgName":null,"overriddenStatus":"UNKNOWN"},"host":"PMOMIS-PC.dayang.com","port":8080}]

这个方法我们在后面应用调另一个应用服务的时候 将会用到。

添加配置文件application.yml

server:
  port: 8080
spring:
  application:
    name: One-cloud-client    #为你的应用起个名字,该名字将注册到eureka注册中心
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/  #eureka服务地址,同一台机器可以忽略

启动服务之后,这个应用就会根据配置文件里的Eureka服务器地址去注册自己。

同样 我们会在Eureka首页里发现出现这么一个application

这样整个服务的注册和发现就完成了。

注意点:

    1:当一个客户端注册到eureka,它会提供关于它自己的端口、地址、健康监控url和home页面等等的元数据,erueka会从每个实例接受心跳信息。如果心跳在配置的时间内失败,实例通常会从注册表中移除。 

    2:注册服务默认心跳时间为30秒,当一个服务器不可用,需要3个心跳才能让服务器和客户端的元数据相同。可以使用eureka.instance.leaseRenewalIntervalInSeconds加快这个过程。在生产环境最好使用默认配置。不过这个配置不建议改,Eureka会通过这个参数去判断服务是否大面积宕机而采取相关措施(此处我还没实现,有待讨论)

    相关资料文章及出处:

        http://blog.csdn.net/zhuchuangang/article/details/51202307

        http://blog.csdn.net/lc0817/article/details/54375802

代码解析可以参考这篇文章:http://blog.csdn.net/neosmith/article/details/53131023

或者可以根据日志去看

我们可以从EurekaServerBootstrap这个类出发

© 著作权归作者所有

共有 人打赏支持
Twelve_ZX
粉丝 11
博文 25
码字总数 25988
作品 0
海淀
程序员
私信 提问
SpringCloud使用Prometheus监控(基于Eureka)

本文介绍SpringCloud使用Prometheus,基于Eureka服务发现。 1.Prometheus介绍 在之前写过两篇有关Prometheus使用的文章,如下: 《SpringBoot使用prometheus监控》 《SpringBoot使用SOFA-Lo...

dalaoyang
03/11
0
0
SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)

前言 本篇主要介绍的是SpringCloud相关知识、微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka)。 SpringCloud介绍 Spring Cloud是在Spring Boot的基础上构建的,用于简化分布...

虚无境
01/14
0
0
SpringCloud--鸿鹄Cloud分布式微服务云系统

简介 鸿鹄云Cloud是基于SpringCloud来封装的,是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器...

itcloud
2018/07/25
0
0
Spring Cloud-honghu Cloud分布式微服务云系统

简介 鸿鹄云Cloud是基于SpringCloud来封装的,是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器...

itcloud
2018/04/25
0
0
Spring Cloud-Eureka Client 原理解析

SpringCloud-Spring Cloud Context SpringCloud-Eureka 服务注册 SpringCloud-Eureka 服务发现 Spring Cloud-Eureka Client 原理解析 SpringCloud-声明式服务调用 Feign SpringCloud-负载均衡......

glmapper
01/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7 安装maven

进入指定目录 cd /usr/local/src/ 下载maven 包 # 打开这个地址选中自己需要的版本补齐后面的地址,再复制到SSH去执行wget http://mirrors.hust.edu.cn/apache/maven/maven-3/ 解压改名 ...

Elson
55分钟前
4
0
推荐一个开源数据库迁移神器SQLines

SQLines 是一个开源(Apache License 2.0)可伸缩,并发高性能数据传输和schema 转换工具,你可以用作数据库迁移以及ETL过程 支持的数据库: Oracle and Oracle Exadata Microsoft SQL Server...

Benz001
57分钟前
12
0
面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题

今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一、缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Re...

我最喜欢三大框架
58分钟前
6
0
composer 很慢怎么办?

关于 Composer 的详细安装使用,详见之前的文章:在 PHP 中安装、使用 Composer 包管理工具 Composer 在国内不管是更新还是安装等都有一个「慢」的问题,有的时候真的很煎熬。 因此我们一般会...

whoru
今天
2
0
ffmpeg提取音频文件

问题 从特定的mp3音频文件中,提取一部分作为新的mp3文件 ffmpeg ffmpeg -i a.mp3 -ss 00:25:00 -to 00:28:20 -acodec copy b.mp3 -i输入的文件 -ss从指定时间点开始提取 -to到指定时间点结...

亚林瓜子
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部