Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员自己的笔记本电脑,裸机数据中心,以及Cloud Foundry等托管平台。
版本:Dalston.RELEASE
特性
Spring Cloud专注于提供良好的开箱即用经验的典型用例和可扩展性机制覆盖。
-
分布式/版本化配置
-
服务注册和发现
-
路由
-
service - to - service调用
-
负载均衡
-
断路器
-
分布式消息传递
引导应用程序上下文
一个Spring Cloud应用程序通过创建一个“引导”上下文来进行操作,这个上下文是主应用程序的父上下文。开箱即用,负责从外部源加载配置属性,还解密本地外部配置文件中的属性。这两个上下文共享一个Environment
,这是任何Spring应用程序的外部属性的来源。Bootstrap属性的优先级高,因此默认情况下不能被本地配置覆盖。
引导上下文使用与主应用程序上下文不同的外部配置约定,因此使用bootstrap.yml
application.yml
(或.properties
)代替引导和主上下文的外部配置。例:
bootstrap.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring:
application:
name: foo
cloud:
config:
uri: ${SPRING_CONFIG_URI:http://localhost:8888}</span></span>
如果您的应用程序需要服务器上的特定于应用程序的配置,那么设置spring.application.name
(在bootstrap.yml
或application.yml
)中是个好主意。
您可以通过设置spring.cloud.bootstrap.enabled=false
(例如在系统属性中)来完全禁用引导过程。
应用程序上下文层次结构
如果您从SpringApplication
或SpringApplicationBuilder
构建应用程序上下文,则将Bootstrap上下文添加为该上下文的父级。这是一个Spring的功能,即子上下文从其父进程继承属性源和配置文件,因此与不使用Spring Cloud Config构建相同上下文相比,“主”应用程序上下文将包含其他属性源。额外的财产来源是:
-
“bootstrap”:如果在Bootstrap上下文中找到任何
PropertySourceLocators
,则可选CompositePropertySource
显示为高优先级,并且具有非空属性。一个例子是来自Spring Cloud Config服务器的属性。有关如何自定义此属性源的内容的说明,请参阅 下文。 -
“applicationConfig:[classpath:bootstrap.yml]”(如果Spring配置文件处于活动状态,则为朋友)。如果您有一个
bootstrap.yml
(或属性),那么这些属性用于配置引导上下文,然后在父进程设置时将它们添加到子上下文中。它们的优先级低于application.yml
(或属性)以及作为创建Spring Boot应用程序的过程的正常部分添加到子级的任何其他属性源。有关如何自定义这些属性源的内容的说明,请参阅下文。
由于属性源的排序规则,“boot”条目优先,但请注意,这些条目不包含来自bootstrap.yml
的任何数据,它具有非常低的优先级,但可用于设置默认值。
您可以通过简单地设置您创建的任何ApplicationContext
的父上下文来扩展上下文层次结构,例如使用自己的界面,或使用SpringApplicationBuilder
方便方法(parent()
,child()
和sibling()
)。引导环境将是您创建自己的最高级祖先的父级。层次结构中的每个上下文都将有自己的“引导”属性源(可能为空),以避免无意中将值从父级升级到其后代。层次结构中的每个上下文(原则上)也可以具有不同的spring.application.name
,因此如果存在配置服务器,则不同的远程属性源。普通的Spring应用程序上下文行为规则适用于属性解析:子环境中的属性通过名称和属性源名称覆盖父项中的属性(如果子级具有与父级名称相同的属性源,一个来自父母的孩子不包括在孩子中)。
请注意,SpringApplicationBuilder
允许您在整个层次结构中共享Environment
,但这不是默认值。因此,兄弟情境尤其不需要具有相同的资料或财产来源,尽管它们与父母共享共同点。
改变引导位置Properties
可以使用spring.cloud.bootstrap.name
(默认“引导”)或spring.cloud.bootstrap.location
(默认为空)指定bootstrap.yml
(或.properties
)位置,例如在系统属性中。这些属性的行为类似于具有相同名称的spring.config.*
变体,实际上它们用于通过在其Environment
中设置这些属性来设置引导ApplicationContext
。如果在正在构建的上下文中有活动的配置文件(来自spring.profiles.active
或通过Environment
API)),则该配置文件中的属性也将被加载,就像常规的Spring Boot应用程序,例如来自bootstrap-development.properties
的“开发”简介。
独立模式
只要存在某种监视器或springbot运行时间(例如Cloud Foundry),两个高速缓存(客户机和服务器)和心跳的组合使独立的Eureka服务器对故障具有相当的弹性。在独立模式下,您需要关闭客户端注册行为,这样才不会向自己注册。例:
application.yml(Standalone Eureka Server)
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/</span></span>
一、创建一个maven项目:
<?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>
<artifactId>springcloud-example01</artifactId>
<groupId>com.xslde</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>eureka-server</module>
<module>eureka-client</module>
</modules>
<!--约束springboot版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.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>Finchley.RELEASE</spring-cloud.version>
</properties>
<!--依赖管理-->
<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>
<!--使用163仓库-->
<repositories>
<repository>
<id>163</id>
<name>central</name>
<url>http://mirrors.163.com/maven/repository/maven-public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>163</id>
<name>central</name>
<url>http://mirrors.163.com/maven/repository/maven-public/</url>
</pluginRepository>
</pluginRepositories>
</project>
二、在上一个项目下建立两个子工程:
1、创建服务端:
1)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">
<parent>
<artifactId>springcloud-example01</artifactId>
<groupId>com.xslde</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring安全管理框架依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--服务注册与发现服务端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2)在服务端中创建一个启动类并加上启用EurekaServer注解:
package com.xslde;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Created by xslde on 2018/7/21
*/
@EnableEurekaServer//启用服务注册与发现服务端
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
3)在服务端中配置安全管理:
package com.xslde.configure;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* Created by xslde on 2018/7/21
*/
@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//为了支持http://xslde:[email protected]:7100/eureka/这种认证方式,需启用httpBasic
http.authorizeRequests().anyRequest().authenticated().and().csrf().disable().httpBasic();
}
}
4)在 resources文件夹下创建一个bootstrap.yml文件:
server:
port: 7100 #启动端口号
spring:
application:
name: xslde-eureka #服务名称
security:
user:
name: xslde #用户名
password: 123456 #密码
eureka:
instance:
hostname: 127.0.0.1
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
#配置属性,因为 Eureka 自我保护模式以及心跳周期长的原因,经常会遇到 Eureka 服务不移除已关闭的服务
server:
#关闭自我保护机制
enable-self-preservation: false
#设置移除间隔时间
eviction-interval-timer-in-ms: 2000
5)启动项目,在浏览器中访问http://localhost:7100,输入用户名和密码(123456):
登陆成功后:
服务端创建完成。
2、创建一个客户端,向服务端注册服务
1)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">
<parent>
<artifactId>springcloud-example01</artifactId>
<groupId>com.xslde</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-client</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
2)创建一个启动类,并启用客户端注解:
package com.xslde;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by xslde on 2018/7/21
*/
@RestController
@EnableEurekaClient //启用客户端
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class,args);
}
@GetMapping("/{str}")
public String test(@PathVariable(name = "str") String str){
return "您输入的值:"+str;
}
}
3)在resources文件夹下创建一个bootstrap.yml文件:
server:
port: 7101 #启动端口号
spring:
application:
#配置应用名称,后期可根据应用名称调用应用的应服务
name: eureka-client
eureka:
instance:
hostname: localhost
client:
service-url:
#向服务中心注册服务,xslde:123456是用户名称和密码
defaultZone: http://xslde:123456@${eureka.instance.hostname}:7100/eureka/
4)启动项目并查看http://localhost:7100/,客户端已经成注册到服务端:
5)浏览器访问:http://localhost:7101/这是我的微服务,
到这里一个简单的服务注册就完成了。