文档章节

Eureka2.0集群 高可用的认证服务实现与搭建

边鹏_尛爺鑫
 边鹏_尛爺鑫
发布于 2018/05/28 15:28
字数 1065
阅读 2501
收藏 47

        Springboot-2.0.2.RELEASE Eureka认证后,服务注册失败问题。

        随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,意义可能会堪比当年Servlet规范的诞生,有效推进服务端软件系统技术水平的进步。

        SpringCloud Eureka是SpringCloud Netflix服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能。今天就来讲讲Eureka的高可用实现与搭建

MAVEN相关配置

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.2.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.BUILD-SNAPSHOT</spring-cloud.version>
</properties>

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

application.yml 相关配置

spring:
  application:
    name: EUREKA
--- #注意这里是三个"减号"
spring:
  profiles: eureka1
  security:
    user:
      name: admin
      password: 123123
server:
  port: 8001
eureka:
  instance:
    hostname: eureka1
  client:
    serviceUrl:
      defaultZone: http://admin:123123@eureka2:8002/eureka/,http://admin:123123@eureka3:8003/eureka/
    fetch-registry: true
    register-with-eureka: true
---
spring:
  profiles: eureka2
  security:
    user:
      name: admin
      password: 123123
server:
  port: 8002
eureka:
  instance:
    hostname: eureka2
  client:
    serviceUrl:
      defaultZone: http://admin:123123@eureka1:8001/eureka/,http://admin:123123@eureka3:8003/eureka/
    fetch-registry: true
    register-with-eureka: true
---
spring:
  profiles: eureka3
  security:
    user:
      name: admin
      password: 123123
server:
  port: 8003
eureka:
  instance:
    hostname: eureka3
  client:
    serviceUrl:
      defaultZone: http://admin:123123@eureka1:8001/eureka/,http://admin:123123@eureka2:8002/eureka/
    fetch-registry: true
    register-with-eureka: true

从上面的配置可以看出我们配置了3个Euerka服务,端口号分别是8001和8002与8003。
验证的用户名和密码是:admin:123123

启动类代码

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

到这代码就基本完了,本地已经可以运行了。

启动前先在hosts文件添加内容如下:

127.0.0.1 eureka1
127.0.0.1 eureka2
127.0.0.1 eureka3

先本地运行一下:run configurations

分别启动3个配置eureka1,eureka2,eureka3,启动后到浏览器输入:http://eureka1:8001/ 输入你的用户名和密码。

敲黑板: 页面中Instances currently registered with Eureka下面并没得注入的别的服务,各种搜索引擎各种收,没得个所以然,去掉Spring Security后问题解决,可以知道问题是Spring Security引起的,查看源码发现CSRF保护默认是开启的,可以禁用掉即可。

老版本代码

security:   
  basic:
    enabled: true
  user:
    name: admin
    password: 123123

新版本解决方案

添加一个配置类禁用csrf如下:(但是你会发现,注入服务确不需要密码了,说明失去了验证。)

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;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
    }
}

完整的代码如下:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    	http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

完美的结果

再次启动三个eureka服务,如果一切都正确的话,结果入图下:

在Centos上运行的脚本

启动脚本:

#!/bin/sh
#启动服务
APP_NAME=eureka-0.0.1-SNAPSHOT
rm -f tpid
nohup java -jar /data/apps/eureka/$APP_NAME --spring.profiles.active=eureka1> /data/apps/eureka/eureka1.log
nohup java -jar /data/apps/eureka/$APP_NAME --spring.profiles.active=eureka2> /data/apps/eureka/eureka2.log
nohup java -jar /data/apps/eureka/$APP_NAME --spring.profiles.active=eureka3> /data/apps/eureka/eureka3.log
echo $! > tpid
echo Start Success!

停止脚本:

#!/bin/sh
#停止服务
APP_NAME=eureka-0.0.1-SNAPSHOT
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Stop Process...'
    kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Kill Process!'
    kill -9 $tpid
else
    echo 'Stop Success!'
fi

后面的脚本我自己没验证,我也不怎么会写脚本,如果那个大神提供更好的脚本,小编感激不尽

源码地址:https://gitee.com/bianxin.com/earn_knife/tree/master/eureka

欢迎加入技术讨论群:340697945      

© 著作权归作者所有

共有 人打赏支持
边鹏_尛爺鑫
粉丝 29
博文 30
码字总数 24888
作品 0
成都
程序员
私信 提问
加载中

评论(12)

X
Xesygao
这样就可以关闭csrf并开启认证了
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    //继续执行原有流程,使认证生效
    super.configure(http);
  }
边鹏_尛爺鑫
边鹏_尛爺鑫

引用来自“OSC_qHhGLa”的评论

博主,你这样设置:http.csrf().disable()之后,根本就没有开启安全认证啊!从浏览器可以直接进http://eureka1:8001/eureka/

引用来自“OSC_qHhGLa”的评论

经验证,应当如下配置:
1、eureka server配置:http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
2、eureka client配置:
serviceUrl:#敲黑板:这里不能用service-url和default-zone
defaultZone: http://passwd@localhost :8761/eureka/
你的方案,是对的,谢谢你的提醒哦,Thank you very much
边鹏_尛爺鑫
边鹏_尛爺鑫

引用来自“OSC_qHhGLa”的评论

博主,你这样设置:http.csrf().disable()之后,根本就没有开启安全认证啊!从浏览器可以直接进http://eureka1:8001/eureka/
我操,这是springboot更新了吧,我去,我写这个文章的时候,浏览器是要密码的,我刚刚下下来重新看,果然有问题,我先重新研究一下
浮生若梦_如初
浮生若梦_如初

引用来自“OSC_qHhGLa”的评论

博主,你这样设置:http.csrf().disable()之后,根本就没有开启安全认证啊!从浏览器可以直接进http://eureka1:8001/eureka/
经验证,应当如下配置:
1、eureka server配置:http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
2、eureka client配置:
serviceUrl:#敲黑板:这里不能用service-url和default-zone
defaultZone: http://passwd@localhost :8761/eureka/
浮生若梦_如初
浮生若梦_如初
博主,你这样设置:http.csrf().disable()之后,根本就没有开启安全认证啊!从浏览器可以直接进http://eureka1:8001/eureka/
引鸩怼孑
引鸩怼孑
👍
边鹏_尛爺鑫
边鹏_尛爺鑫

引用来自“流行雨”的评论

谢谢...博主
💪
边鹏_尛爺鑫
边鹏_尛爺鑫

引用来自“流行雨”的评论

我也是最近一直百度,说的都是老版本的....😭,最后只能换成老的版本
😂
流行雨
流行雨
谢谢...博主
流行雨
流行雨
我也是最近一直百度,说的都是老版本的....😭,最后只能换成老的版本
mongodb 高可用集群搭建 续 《安全认证》

一、mongo安全校验机制 1、auth方式 连接mongo服务,使用admin数据库,创建超级管理员用户 db.createUser({user:"admin",pwd:"admin",roles:[{role:"root",db:"admin"}]}); 然后更改数据库(......

二两豆腐
2016/07/15
43
0
高可用简介及简单实现方案

前面介绍了lvs集群架构的搭建,提到了单点故障问题,一旦Director服务器出现问题不可用,lvs集群将整体崩溃,集群所提供的服务将顺利下线。高可用的想法是一旦中间某台服务器丧失提供服务的能...

从运维开始
2017/10/25
0
0
mongoDB高可用集群环境搭建

在生产环境下,部署一台mongodb服务的话,会存在以下问题: 单点问题 生产环境是一个发杂的环境,在这个过程中会产生很多的问题,发生网络故障,服务器宕机,机房停电等,如果是部署单机服务...

二两豆腐
2016/07/11
149
0
RedisCluter集群(一):Redis高可用集群Redis Cluster搭建

原文地址:https://my.oschina.net/lyyjason/blog/1842002 前言: Redis3.0版本之前,可以通过Redis Sentinel(哨兵)来实现高可用 ( HA ),从3.0版本之后,官方推出了Redis Cluster,它的主...

lyyjason
2018/07/07
0
0
KeepAlived集群高可用搭建

你的系统是否存在单点故障呢?那么这里我们基于Docker演示下基于KeepAlive的高可用配置。 简介 KeepAlived是一个用C语言编写的路由软件,它的主要目的是为了提供基于Linux服务器的负载均衡和...

艾贺
2018/08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【机器学习PAI实战】—— 玩转人工智能之商品价格预测

摘要: 我们经常思考机器学习,深度学习,以至于人工智能给我们带来什么?在数据相对充足,足够真实的情况下,好的学习模型可以发现事件本身的内在规则,内在联系。我们去除冗余的信息,可以...

zhaowei121
10分钟前
0
0
Spring拓展接口之FactoryBean,我们来看看其源码实现

是什么 FactoryBean的源码比较简单,大家可以细读下其注释,我做了简单的如下翻译 /** * 实现此接口的bean不能用作普通bean。此bean暴露的对象是通过getObject()创建的对象,而不是它自身...

java菜分享
14分钟前
1
0
Pod在多可用区worker节点上的高可用部署

一、 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布在同一个可用...

阿里云官方博客
20分钟前
0
0
深入理解 Hive 分区分桶 (Inceptor)

分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查...

hblt-j
28分钟前
0
0
数据结构

什么是数据结构 1、数据 数据是描述客观世界的数字、字符以及一切能够输入到计算机中,并且能够被计算机程序处理的符号集合。简言之,数据就是计算机加工处理的原料,是信息的载体。 2、数据...

stars永恒
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部