公众号
关注公众号和我一起学习哦!
目前市场上主流的第一套微服务架构解决方案:Spring Boot + Spring Cloud Netflix 用的人数最多
但是 Netflix 已经在 2018年12月12日已经停止维护了,不过不影响我们正常使用
一、创建项目工程目录
在你的计算机上创建一个文件夹 名称为 hello-spring-cloud-netflix
使用IDEA 打开该目录
二、创建服务注册中心
1. 使用IDEA 创建一个新的模块
2. 创建SpringBoot 项目 名称为 spring-cloud-netflix-eureka
3.添加Eureka注册中心 需要的依赖 pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!--注册SpringBoot的版本与SpringCloud的版本对应-->
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.yufire</groupId>
<artifactId>spring-cloud-netflix-eureka</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>spring-cloud-netflix-eureka</name>
<description>Eureka注册中心</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--添加SpringBoot的Web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加 Eureka的服务端依赖-->
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--Spring Cloud 父级依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</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>
主要添加了 Spring Cloud的父级依赖、Eureka的服务端依赖
4. 修改SpingBoot配置文件application.yml
server:
port: 9988 #服务注册中心端口号
eureka:
instance:
hostname: 127.0.0.1 #服务注册中心IP地址
appname: eureka-server # 该服务的名称
client:
fetchRegistry: false #是否检索其他注册中心
register-with-eureka: false # 是否把自己注册到注册中心 由于该项目是注册中心所以不需要注册
service-url: # 配置注册中心的地址 url
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
server: # 关闭自我安全检查 及时的排除调不可用的服务
enable-self-preservation: false
5. 启动类添加开启Eureka的注解
@EnableEurekaServer // 开启 Eureka服务端
@SpringBootApplication
public class SpringCloudNetflixEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudNetflixEurekaApplication.class, args);
}
}
6. 启动项目
7. 访问 地址
出现以上界面即为 Eureka注册中心启动成功!
三、注册中心添加密码
直接访问就可以进入页面有个隐患,就是非常的不安全,所以我们需要为Eureka注册中心添加密码
添加密码的配置也非常的简单 添加Maven
依赖和application.yml
配置即可
1. pom.xml 中添加以下依赖
<!--登陆或连接验证的依赖 安全依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. application.yml 中配置认证密码
spring:
security:
user:
name: root
password: root
不配置密码也可以 SpringBoot会在项目启动的时候在控制台显示一个临时密码
此时的用户名为 user
Using generated security password: b4562d30-b463-4331-b762-6aebb602c38f
3. 再次访问 就会出现密码验证
4. 输入刚才配置的账号和密码即可进入Eureka控制台
四、配置HTTP密码验证
-
配置这个东西是因为 我们刚才设置了注册中心 密码验证
-
此时我们的provider 和 consumer 项目想要连接上注册中心就会报错
-
由于spring-boot-starter-security默认开启了CSRF校验,对于client端这类非界面应用来说,有些不合适,-但是又没有配置文件的方式可以禁用,需要通过Java配置,进行禁用,如下:
-
这样的话需要连接注册中心的其他项目就可以在连接URL中配置账号和密码 就可以连接上注册中心了
1. 编写配置类 SecurityConfig
package cn.yufire.eureka.server.config;
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;
/**
* <p>
* Description: 开启 http密码验证
* </p>
*
* @author yufire
* @version v1.0.0
* @since 2020-07-07 09:57:49
*/
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
super.configure(http);
}
}
五、搭建Eureka集群
为什么要有集群?
因为 任何节点只有一个是不能保证服务高可用的,所以每个节点可以多有几个,这样即使一个节点挂掉了还有剩下的节点可以用
集群可以理解为:你中有我,我中有你,手拉手肩并肩,一起保证服务的健壮性 可用性。
Eureka集群示意图
开始搭建!!
1. 创建一个文件夹 名称为 eurekas
2. 使用IDEA打开这个文件夹
3. 创建多个Module -> 选择SpringBoot -> 名称为: eureka-server-1
和 eureka-server-2
和 eureka-server-3
4. 添加 三个项目所需依赖 pom.xml 由于三个项目都是 EurekaServer项目 所以 三个项目的依赖都是一样的 C V 即可
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version> <!-- 注意SpringBoot版本 -->
<relativePath/>
</parent>
<dependencies>
<!--添加SpringBoot的Web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加 Eureka的服务端依赖-->
<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-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--Spring Cloud 父级依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
5. 创建配置类 用来关闭HTTP CSRF安全验证 配置类名称为: SecurityConfig
和上边一样 三个项目 C V 即可
package cn.yufire.eureka.server1.config;
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;
/**
* <p>
* Description: 开启 http密码验证
* </p>
*
* @author yufire
* @version v1.0.0
* @since 2020-07-07 09:57:49
*/
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
super.configure(http);
}
}
6. 添加 application.yml
中的配置
以下的eureka地址 已经在本机的hosts文件中设置了映射为 127.0.0.1
- eureka1.com
- eureka2.com
- eureka3.com
eureka-server-1 项目的配置
server:
port: 8001 #服务注册中心端口号
eureka:
instance:
appname: eureka-server-1
eureks2Port: 8002
eureks3Port: 8003
client:
fetch-registry: false #是否检索其他注册中心
register-with-eureka: false # 是否把自己注册到注册中心
service-url: # 配置注册中心的地址 url
defaultZone: http://root:root@eureka2.com:${eureka.instance.eureks2Port}/eureka/,http://root:root@eureka3.com:${eureka.instance.eureks3Port}/eureka/
server: # 关闭自我安全检查
enable-self-preservation: false
# 配置认证密码
spring:
application:
name: eureka-server-1
security:
user:
name: root
password: root
eureka-server-2项目的配置
server:
port: 8002 #服务注册中心端口号
eureka:
instance:
hostname: 127.0.0.1 #服务注册中心IP地址
appname: eureka-server-2
eureks1Port: 8001
eureks3Port: 8003
client:
fetch-registry: false #是否检索其他注册中心
register-with-eureka: false # 是否把自己注册到注册中心
service-url: # 配置注册中心的地址 url
defaultZone: http://root:root@eureka1.com:${eureka.instance.eureks1Port}/eureka/,http://root:root@eureka3.com:${eureka.instance.eureks3Port}/eureka/
server: # 关闭自我安全检查
enable-self-preservation: false
# 配置认证密码
spring:
application:
name: eureka-server-2
security:
user:
name: root
password: root
eureka-server-3项目的配置
server:
port: 8003 #服务注册中心端口号
eureka:
instance:
hostname: 127.0.0.1 #服务注册中心IP地址
appname: eureka-server-3
eureks1Port: 8001
eureks2Port: 8002
client:
fetch-registry: false #是否检索其他注册中心
register-with-eureka: false # 是否把自己注册到注册中心
service-url: # 配置注册中心的地址 url
defaultZone: http://root:root@eureka1.com:${eureka.instance.eureks1Port}/eureka/,http://root:root@eureka2.com:${eureka.instance.eureks2Port}/eureka/
server: # 关闭自我安全检查
enable-self-preservation: false
# 配置认证密码
spring:
application:
name: eureka-server-3
security:
user:
name: root
password: root
主要配置了 defaultZone属性中的 其他Eureka的地址 多个地址使用 ,号 隔开
7. 配置Windows的hosts文件
为什么要配置?
可以看配置文件中的defaultZone 属性中的配置 出现了eureka1.com 和 eureka2.com 和 eureka3.com
我们需要配置hosts 文件才可以正确的解析到 eureka1…3.com 的IP 地址
8. 打开 此电脑 C:\Windows\System32\drivers\etc
这个文件夹里有 一个名称为hosts 或者HOSTS 的文件 这个文件是以键值对 的方式进行配置的
9. 添加 以下内容
127.0.0.1 eureka1.com
127.0.0.1 eureka2.com
127.0.0.1 eureka3.com
10. 保存 hosts文件
11. 启动我们的三个项目
确保启动成功后打开Euraka的管理界面查看除自己意外的其他两个注册中心是否注册成功了
可以看到
-
Eureka1中包含了Eureka2 和 Eureka3
-
Eureka2中包含了Eureka1 和 Eureka3
-
Eureka3中包含了Eureka1 和 Eureka2
你中有我 我中有你 大家一起保证服务的高可用!
如果你出现的情况与上述不符合的话 请检查 配置文件中的defaultZone是否配置正确
六、发布服务到Eureka集群中
把我们的服务发布到注册中心其实很简单 只需要更改 defaultZone属性的值为三个注册中心的地址即可
defaultZone: http://root:root@eureka1.com:${eureks1Port}/eureka,http://root:root@eureka2.com:${eureks2Port}/eureka,http://root:root@eureka3.com:${eureks3Port}/eureka
此时可以看到 我们的服务已经成功的发布到三个注册中心了!
这时候即使挂掉了 1 个注册中心 也不会出现 无法找到服务的情况了