SpringCloud 简介

SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。SpringCloud是基于SpringBoot的。
服务注册发现Eureka
Eureka,是Netfix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行AWS域中的中间服务层,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将它集成在其他子项目spring-cloud-netflix中,以实现spring cloud服务发现功能

Eureka原理

AWS中的几个概念
Region:AWS云服务在全球不同的地方都有数据中心,比如北美、南美和欧洲亚洲等。与此对应,根据地理位置我们把某个地区的基础设施服务集合称为一个区域。不同区域之间是相互独立的。说白了就类似于不同地方的机房。
Available Zone:基于容灾背景提出,简单而言,就是相同region区域不同的机房

服务注册到Eureka
每30s发送心跳监测重新进行租约,如果客户端不能多次更新租约,它将在90s内从服务器注册中心移除。
注册信息和更新会被复制到其他Eureka节点,来自任何区域的客户端可以查找到注册中心信息,每30s发生一次复制来定位他们的服务,并进行远程调用
客户端还可以缓存一些服务实例信息,所以即使Eureka全挂掉,客户端也是可以定位到服务地址的

项目搭建

先创建一个maven主工程

 SpringCloud-服务的注册与发现(Eureka)_spring

下一步

SpringCloud-服务的注册与发现(Eureka)_maven_02

填写GroupId、ArtifactId,下一步

SpringCloud-服务的注册与发现(Eureka)_maven_03

选择maven路径,选择settings, maven配置文件,下一步

SpringCloud-服务的注册与发现(Eureka)_spring_04

填写项目名称、项目所在路径,Finish
配置一下私服,pom中加入

<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>

然后创建两个model工程:一个model工程作为服务注册中心,即Eureka Server,另一个作为Eureka Client

先来创建注册中心

SpringCloud-服务的注册与发现(Eureka)_maven_05

下一步

SpringCloud-服务的注册与发现(Eureka)_maven_06

下一步

SpringCloud-服务的注册与发现(Eureka)_spring_07

选择1.5.13版本的SpringBoot,下一步

SpringCloud-服务的注册与发现(Eureka)_服务器_08

 

注册中心创建完成,pom文件如下

<?xml version="1.0" encoding="UTF-8"?><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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.SpringCloud.eureka</groupId>
<artifactId>eureka-registry</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-registry</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<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>

在启动类上加入eureka注解如下,表明此应用是eureka的注册中心

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {

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

启动一个服务注册中心,只需要一个注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类加上
Eureka是一个高可用组件,他没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下eureka server也是一个eureka client,必须要指定一个server。Eureka server的配置文件application.yml如下

#可以加入安全校验,设置对应的用户名密码即可,pom中需要引入相应的包
security:
basic:
enabled: true
user:
name: admin
password: 123456

server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka
#defaultZone: http://user:password@localhost:8761/eureka

通过eureka.client.registerWithEureka: false 和fetchRegistry: false来表明自己是一个eureka server
在父级项目pom中引入module,如下

<modules>
 
<module>eureka-registry</module>

</modules>

启动后界面如下

SpringCloud-服务的注册与发现(Eureka)_maven_09

 

创建Eureka Client

SpringCloud-服务的注册与发现(Eureka)_maven_10

SpringCloud-服务的注册与发现(Eureka)_服务器_11

SpringCloud-服务的注册与发现(Eureka)_spring_12

完成,pom如下

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.SpringCloud.eureka</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-client</name>
<description>eureka-client-description</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR3</spring-cloud.version>
</properties>

<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>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<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>

 

在项目启动类上加注解,如下

@RestController
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {

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

@Value("${server.port}")
String port;

@GetMapping("/hello")
public String helloEureka(String name){
return "hello,eureka:" + name + ", i am from port:" + port;
}
}

加上@EnableEurekaClient表明自己是eureka client

application.yml如下

spring:
application:
name: eureka-client
server:
port: 8762
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/

设置应用名称,服务端口,注册中心地址,spring.application.name这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name。
在父级项目用引入module,如下

<modules>
  
<module>eureka-registry</module>

<module>eureka-client</module>

</modules>

启动client项目,发现已经注册到注册中心,端口为8762如下图

SpringCloud-服务的注册与发现(Eureka)_服务器_13

 

此时在浏览器请求

​http://localhost:8762/hello​

SpringCloud-服务的注册与发现(Eureka)_maven_14

 

补充:

eureka.client.allow-redirects:是否允许重定向Eureka客户端请求到其他或者备份服务器,默认为fasle
eureka.client.eureka-connection-idle-timeout-seconds:HTTP连接到eureka服务器可以在关闭之前保持空闲的时间(几秒钟)。
eureka.client.eureka-server-connect-timeout-seconds:表示连接Eureka服务器,等待多长时间算超时
eureka.client.eureka-server-port: Eureka Server端口
eureka.client.eureka-server-d-n-s-name:获取要查询的DNS名称以获得eureka服务器的列表。
eureka.client.eureka-server-read-timeout-seconds:示在从eureka服务器读取数据之前需要等待多长时间(以秒为单位)
eureka.client.eureka-server-total-connections:从eureka客户端到所有eureka服务器的所允许连接总数。
eureka.client.eureka-server-total-connections-per-host:设置每一个主机所允许的到Eureka Server连接的数量
eureka.client.fetch-registry: 是否允许客户端向Eureka 注册表获取信息,一般服务器为设置为false,客户端设置为true
eureka.client.register-with-eureka:是否允许向Eureka Server注册信息,默认true,如果是服务器端,应该设置为false
eureka.client.fetch-remote-regions-registry:逗号分隔的区域列表,用于获取eureka注册信息
eureka.client.g-zip-content:从服务器端获取数据是否需要压缩
eureka.client.prefer-same-zone-eureka: 是否优先使选择相同Zone的实例,默认为true
eureka.client.registry-fetch-interval-seconds:多长时间从Eureka Server注册表获取一次数据,默认30s
eureka.client.service-url:可用区域映射,列出完全合格的url与eureka服务器通信。每个值可以是一个URL,也可以是一个逗号分隔的替代位置列表。
eureka.dashboard.enabled: 是否启用Eureka首页,默认为true
eureka.dashboard.path: 默认为/
eureka.instance.appname:在eureka注册的应用程序的名称。
eureka.instance.app-group-name:在eureka注册的应用程序的组名称
eureka.instance.health-check-url: 健康检查绝对路径
eureka.instance.health-check-url-path:健康检查相对路径
eureka.instance.hostname:设置主机名
eureka.instance.instance-id:设置注册实例的id
eureka.instance.lease-expiration-duration-in-seconds:设置多长时间意味着租约到期,默认90
eureka.instance.lease-renewal-interval-in-seconds:表示Eureka客户端需要发送心跳到eureka服务器的频率(以秒为单位),以表明它仍然存在。指定的期间内如果没有收到心跳leaseExpirationDurationInSeconds
eureka.instance.metadata-map:可以设置元数据
eureka.instance.prefer-ip-address: 实例名以IP,但是建议hostname,默认为false