如何在Zuul上实现CAS的单点登录
前言最近项目跟一个基于CAS的系统对接做单点登录,之前在传统框架做过CAS的对接,本来以为很简单,简单配置一下双方对好账户就完了,但现在系统架构调整为SpringCloud的微服务体系,这让这次对接就不那么简单直接的。本文主要讨论CAS与Zuul上的结合思路。
CAS原理CAS的基本原理还是挺简单的,如下图所示。
主要就是1.拦截重定向2.登录3.验证4.获取用户信息看着挺复杂,但其实框架已经把大部分工作都做好了,封装起来了,正常情况下我们只需要配置一下就ok了,但在微服务的环境下还是挺让人迷惑的。对了我们用的是CAS3.5版本搭建的测试系统。
实现思路Zuul作为整个系统的网关,有几样工作特别适合:1.路由,Zuul的天职2.负载均衡,Zuul 2.0的性能还是可以期待的3.日志,由于外部的请求都经过Zuul因此它的日志处理是非常重要和必要的4.鉴权,同样由于外部服务都经过Zuul,鉴权也是非常合适的,因此对于SpringCloud体系来说做CAS的单点登录的集成Zuul是最合适不过的。
我们Zuul也是基于SpringBoot,因此可以使用Spring Security的套路实现 ...
微服务Eureka使用详解
Eureka是spring cloud中的一个负责服务注册与发现的组件。遵循着CAP理论中的A(可用性)P(分区容错性)。
一个Eureka中分为eureka server和eureka client。其中eureka server是作为服务的注册与发现中心。eureka client既可以作为服务的生产者,又可以作为服务的消费者。具体结构如下图:
上图中我们首先会启动一个或多个Eureka server,这些eureka server同步保留着所有的服务信息。然后我们启动不同的eureka client,向服务端发起服务注册和服务查询。不论我们是向那个eureka server进行的注册,最终都会同步给所有配置好的eureka server。我们获取的服务信息,也同样都是一致的。
eureka server实现
spring cloud是基于spring boot进行的开发,因此我们需要创建一个spring boot项目,同时在里面添加eureka server包。
12345678910111213141516 <dependency> < ...
微服务架构实践
目录
业务背景 微服务概念 微服务技术选型 微服务架构设计 微服务架构设计落地 微服务架构设计过程中积累的心得 总结
一、业务背景
1.1 产品现状
1、各产品系统独立开发,代码复用率低,系统之间互相调用,耦合严重,系统解耦独立部署困难。 2、传统的单体架构,规模越来越大也越来越笨重;当新功能的开发、功能的重构变得不再敏捷可控;测试者的回归测试边界难以琢磨;系统的上线部署也变的艰难 3、高并发访问下无法提供可靠性服务 4、持续集成、持续部署、持续交付等工程效率化工具严重缺失 5、监控系统、日志分析等系统稳定性工具严重缺失 以上种种情况,都让我们应对需求的变化而变得迟钝。
1.2 业务需求
架构肯定是为业务需求而生的,先来看看我们面对的业务需求及其特点。平台最主要满足两大类业务需求:面向餐饮企业在餐饮新零售下的经营和运营需求和面向产品及运营团队。 具体来看: 1、餐饮新零售下的餐饮企业经营和运营的痛点
· 如何提升营销能力和管理会员,以更低的成本为餐饮企业带来更多利润
· 如何对数据进行深度挖掘和分析,助力决策者进行运营决策
· 如何掌握实时数据,让决策者 ...
最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)
前言:
最近开发了Zuul网关的实现和Spring Cloud Gateway实现,对比Spring Cloud Gateway发现后者性能好支持场景也丰富。在高并发或者复杂的分布式下,后者限流和自定义拦截也很棒。
提示:
本文主要列出本人开发的Zuul网关核心代码以及Spring Cloud Gateway核心代码实现。因为本人技术有限,主要是参照了 Spring Cloud Gateway 如有不足之处还请见谅并留言指出。
1:为什么要做网关
(1)网关层对外部和内部进行了隔离,保障了后台服务的安全性。
(2)对外访问控制由网络层面转换成了运维层面,减少变更的流程和错误成本。
(3)减少客户端与服务的耦合,服务可以独立运行,并通过网关层来做映射。
(4)通过网关层聚合,减少外部访问的频次,提升访问效率。
(5)节约后端服务开发成本,减少上线风险。
(6)为服务熔断,灰度发布,线上测试提供简单方案。
(7)便于进行应用层面的扩展。
相信在寻找相关资料的伙伴应该都知道,在微服务环境下,要做到一个比较健壮的流量入口还是很重要的,需要考虑的问题也比较复杂和众多。
2:网关和鉴权基本实现架 ...
搭建SpringCloud项目,并实现自动化部署
前一阵子一直在忙着做项目,最近有空,把项目中用到的SpringBoot微服务相关架构再梳理一遍。
项目资源:https://github.com/sunroyi/SpringCloud
主要分为以下几步:
(1)搭建SpringBootService,这里是各个微服务的业务逻辑。(这里搭建了2个Service,用来测试熔断)
(2)搭建SpringBootEureka,用来发现服务。
(3)搭建SpringBootConfig,用于动态维护配置文件。
(4)搭建SpringBootConsumer,这个不是必须的,只有当一个更大的业务需要调用其他多个微服务Service时才需要搭建。
可以通过Ribbon+RestTemplate,Feign两种方式进行微服务之间的调用。可以加入Hystrix进行熔断处理。
(5)搭建SpringBootZuul,用于路由控制。可以加入Hystrix用于熔断处理。
(6)使用Jenkins进行代码的自动化部署。
-—————————————————————————————————————–
在项目搭建之前,需要先了解Spring Cloud ...
漫谈网络通信——从OSI网络模型到TCP/IP协议族
OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信规范。而我们的数据在网络中传输的过程,实际上就是如下图的封装和解封装的过程,发送方通过各种封装处理,把数据转换成比特流的形式,比特流在信号传输的硬件媒介中传输,接收方再把比特流进行解封装处理。
1.物理层
规定了如何为网络通信实现最底层的物理连接,以及物理设备的机械、电气、功能和过程特性。如:如何使用电缆和接头的类型、用来传送信号的电压等。需要注意的是,网络通信过程中所需的物理媒介(网线、线缆等),其实并不属于物理层,因为物理层实际上是一种规定,规定这些物理媒介设备在连接网络时的各种规格、参数以及工作方式。但是同时,双绞线、线缆等物理媒介又是物理层的实现。
2.数据链路层
规定了如何进行物理地址寻址、如何在物理线路上进行数据(帧frame)的可靠传递以及流量控制。
数据链路层协议有SLIP协议、CSLIP协议、PPP协议等。交换机,对帧解码并根据帧中包含的信息把数据发送到 ...
超强、超详细Redis入门教程
转载自:http://www.h5min.cn/article/56448.htm这篇文章主要介绍了超强、超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下
【本教程目录】
1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8.redis数据结构 – strings9.redis数据结构 – lists10.redis数据结构 – 集合11.redis数据结构 – 有序集合12.redis数据结构 – 哈希13.聊聊redis持久化 – 两种方式14.聊聊redis持久化 – RDB15.聊聊redis持久化 – AOF16.聊聊redis持久化 – AOF重写17.聊聊redis持久化 – 如何选择RDB和AOF18.聊聊主从 – 用法19.聊聊主从 – 同步原理20.聊聊redis的事务处理21.教你看懂redis配置 – 简介22.教你看懂redis配置 -通用23.教你看懂redis配置 – 快照24.教你看懂redi ...
Python实现简单的API接口
get方法代码实现# coding:utf-8
import jsonfrom urlparse import parse_qsfrom wsgiref.simple_server import make_server
# 定义函数,参数是函数的两个参数,都是python本身定义的,默认就行了。def application(environ, start_response):# 定义文件请求的类型和当前请求成功的codestart_response(‘200 OK’, [(‘Content-Type’, ‘text/html’)])# environ是当前请求的所有数据,包括Header和URL,body,这里只涉及到get# 获取当前get请求的所有数据,返回是string类型params = parse_qs(environ[‘QUERY_STRING’])# 获取get中key为name的值name = params.get(‘name’, [‘’])[0]no = params.get(‘no’, [‘’])[0]
# 组成一个数组,数组中只有一个字典dic = {‘name’ ...
Python 3 利用 Dlib 实现摄像头实时人脸识别
Python 3 利用 Dlib 实现摄像头实时人脸识别
0. 引言
利用 Python 开发,借助 Dlib 库捕获摄像头中的人脸,提取人脸特征,通过计算特征值之间的欧氏距离,来和预存的人脸特征进行对比,判断是否匹配,达到人脸识别的目的;
可以从摄像头中抠取人脸图片存储到本地,然后提取构建预设人脸特征;
根据抠取的 / 已有的同一个人多张人脸图片提取 128D 特征值,然后计算该人的 128D 特征均值;
然后和摄像头中实时获取到的人脸提取出的特征值,计算欧氏距离,判定是否为同一张人脸;
Python + OpenCv + Dlib ;
Features :
支持人脸数据采集,自行建立人脸数据库 / Support face register
调用摄像头实时人脸检测和识别 / Using camera to real-time detect and recognize faces
支持多张人脸 / Support multi-faces
人脸识别 / Face Recognition 的说明:
Wikipedia 上关于人脸识别系统 / F ...
Python数据挖掘-回归分析
本文用Python实现数据回归,包括线性回归(一元线性+多元线性回归)、Logistics回归。主要通过实验验证,部分例题来自网络。
注:更多资源及软件请W信关注“**学娱汇聚门**”
一、一元线性回归
举例及代码实现:
汽车卖家做电视广告数量与卖出的汽车数量:
代码:
1.3 Python代码实现:
import numpy as np
def fitSLR(x, y):
n = len(x)
dinominator = 0
numerator = 0
for i in range(0, n):
numerator += (x[i] - np.mean(x))*(y[i] - np.mean(y))
dinominator += (x[i] - np.mean(x))**2
b1 = numerator/float(dinominator)
b0 = np.mean(y)/float(np.mean(x))
return b0, b1
def predict(x, b0, b1):
return b0 + x*b1
x ...