一 springcloud简介
目前的springcloud的版本 Finchley.RELEASE springboot的版本 2.0.3.RELEASE
Finchley版本的官方文档如下:
http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html
spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于springboot的,所以需要开发中对springboot有一定的了解。另外对于“微服务架构” 不了解的话,可以通过搜索引擎搜索“微服务架构”了解下!
二 创建服务注册中心
在这里,我还是采用Eureka作为服务注册与发现的组件,至于其他的服务发现组件之后会出文章详细介绍。
2.1 首先创建一个maven主工程。
首先创建一个主Maven工程,在其pom文件引入依赖,spring Boot版本为2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE。这个pom文件作为父pom文件,起到依赖版本控制的作用,其他module工程继承该pom。这一系列文章全部采用这种模式,其他文章的pom跟这个pom一样。再次说明一下,以后不再重复引入。
2.2 创建eureka-server Module
继续next 创建eureka-server Module 其依赖如下:
<?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.hmzj</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka-server</name> <description>EurekaServer project for Spring Boot</description> <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> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <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-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-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>
@EnableEurekaServer //开启EurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
2.3 Eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。eureka server的配置文件appication.yml:
server: port: 8060 spring: application: name: eureka-server eureka: server: enable-self-preservation: true # 测试时关闭自我保护机制,保证不可用服务及时踢出 client: register-with-eureka: false fetchRegistry: false serviceUrl: defaultZone: http://127.0.0.1:8060/eureka/
通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.
2.4 eureka server 是有界面的,启动工程,打开浏览器访问: http://localhost:8060 ,界面如下:
No application available 没有服务被发现 因为没有注册服务。
到此一个简单的服务端就完成了!
三 给Eureka Server加上安全验证
- 引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2.application.yml中添加配置
spring:
security:
user:
name: **
password: **
修改defaultZone: http://pyq:123456@localhost:8060/eureka/
serviceUrl格式:http://<username>:<password>@ip:port/eureka
# 此种方法已经过时
security:
basic:
enabled: true
user:
name: admin # 用户名
password: admin123 # 用户密码
3.由于Finchey版本默认开启csrf 为了可以使用 http://${userName}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,写一个配置类
package com.hmzj.eurekaserver; import org.springframework.context.annotation.Configuration; 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; import org.springframework.security.config.http.SessionCreationPolicy; @EnableWebSecurity @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER); http.csrf().disable(); //关闭csrf //注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,如果是form方式,不能使用url格式登录 http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); //开启认证 } }
4.此时再重新启动eureka-server 打开浏览器访问: http://localhost:8060 就需要账号和密码了
四 高可用的服务注册中心 (双注册节点)
新建一个application-peer1.yml和application-peer2.yml
server: port: 8060 spring: application: name: eureka-server security: user: name: ** password: ** profiles: peer1 eureka: instance: hostname: peer1 client: register-with-eureka: false fetchRegistry: false serviceUrl: defaultZone: http://**:**@127.0.0.1:8061/eureka/ #注意端口
注意:在使用双节点注册时应在注册时将 defaultZone: http://**:**@127.0.0.1:8061/eureka/ 的端口写成另外一个节点的端口
server: port: 8061 spring: application: name: eureka-server security: user: name: ** password: ** profiles: peer2 eureka: instance: hostname: peer2 client: register-with-eureka: false fetchRegistry: false serviceUrl: defaultZone: http://**:**@127.0.0.1:8060/eureka/ #注意端口
按照官方文档的指示,需要改变etc/hosts,linux系统通过vi /etc/hosts ,加上:
127.0.0.1 peer1
127.0.0.1 peer2
windows电脑,在c:/windows/systems/drivers/etc/hosts 修改
linux上将eureka-server打包 编译后 运行jar包
nohup java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 >/dev/null 2>&1 & nohup java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2 >/dev/null 2>&1 &
完美注册!