首页 文章 精选 留言 我的

精选列表

搜索[分布式锁],共10000篇文章
优秀的个人博客,低调大师

(十) Spring Cloud构建分布式微服务架构 - SSO单点登录之OAuth2.0登录认证(1)

之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一、oauth中的角色client:调用资源服务器API的应用 Oauth 2.0 Provider:包括Authorization Server和Resource Server (1)Authorization Server:认证服务器,进行认证和授权 (2)Resource Server:资源服务器,保护受保护的资源user:资源的拥有者 二、下面详细介绍一下Oauth 2.0 ProviderAuthorization Server:(1)AuthorizationEndpoint:进行授权的服务,Default URL: /oauth/authorize (2)TokenEndpoint:获取token的服务,Default URL: /oauth/token Resource Server:OAuth2AuthenticationProcessingFilter:给带有访问令牌的请求加载认证 三、下面再来详细介绍一下Authorization Server:一般情况下,创建两个配置类,一个继承AuthorizationServerConfigurerAdapter,一个继承WebSecurityConfigurerAdapter,再去复写里面的方法。 主要出现的两种注解:1、@EnableAuthorizationServer:声明一个认证服务器,当用此注解后,应用启动后将自动生成几个Endpoint:(注:其实实现一个认证服务器就是这么简单,加一个注解就搞定,当然真正用到生产环境还是要进行一些配置和复写工作的。) /oauth/authorize:验证 /oauth/token:获取token /oauth/confirm_access:用户授权 /oauth/error:认证失败 /oauth/check_token:资源服务器用来校验token /oauth/token_key:如果jwt模式则可以用此来从认证服务器获取公钥 以上这些endpoint都在源码里的endpoint包里面。 2、@Beans:需要实现AuthorizationServerConfigurer AuthorizationServerConfigurer包含三种配置: ClientDetailsServiceConfigurer:client客户端的信息配置,client信息包括:clientId、secret、scope、authorizedGrantTypes、authorities (1)scope:表示权限范围,可选项,用户授权页面时进行选择 (2)authorizedGrantTypes:有四种授权方式 Authorization Code:用验证获取code,再用code去获取token(用的最多的方式,也是最安全的方式)Implicit: 隐式授权模式Client Credentials (用來取得 App Access Token)Resource Owner Password Credentials(3)authorities:授予client的权限 这里的具体实现有多种,in-memory、JdbcClientDetailsService、jwt等。 AuthorizationServerSecurityConfigurer:声明安全约束,哪些允许访问,哪些不允许访问 AuthorizationServerEndpointsConfigurer:声明授权和token的端点以及token的服务的一些配置信息,比如采用什么存储方式、token的有效期等 client的信息的读取:在ClientDetailsServiceConfigurer类里面进行配置,可以有in-memory、jdbc等多种读取方式。 jdbc需要调用JdbcClientDetailsService类,此类需要传入相应的DataSource. 下面再介绍一下如何管理token:AuthorizationServerTokenServices接口:声明必要的关于token的操作 (1)当token创建后,保存起来,以便之后的接受访问令牌的资源可以引用它。 (2)访问令牌用来加载认证 接口的实现也有多种,DefaultTokenServices是其默认实现,他使用了默认的InMemoryTokenStore,不会持久化token; token存储方式共有三种分别是:(1)InMemoryTokenStore:存放内存中,不会持久化 (2)JdbcTokenStore:存放数据库中 (3)Jwt: json web token 授权类型:可以通过AuthorizationServerEndpointsConfigurer来进行配置,默认情况下,支持除了密码外的所有授权类型。相关授权类型的一些类: (1)authenticationManager:直接注入一个AuthenticationManager,自动开启密码授权类型 (2)userDetailsService:如果注入UserDetailsService,那么将会启动刷新token授权类型,会判断用户是否还是存活的 (3)authorizationCodeServices:AuthorizationCodeServices的实例,auth code 授权类型的服务 (4)implicitGrantService:imlpicit grant (5)tokenGranter: endpoint的URL的配置:(1)AuthorizationServerEndpointsConfigurer的pathMapping()方法,有两个参数,第一个是默认的URL路径,第二个是自定义的路径 (2)WebSecurityConfigurer的实例,可以配置哪些路径不需要保护,哪些需要保护。默认全都保护。 自定义UI:(1)有时候,我们可能需要自定义的登录页面和认证页面。登陆页面的话,只需要创建一个login为前缀名的网页即可,在代码里,设置为允许访问,这样,系统会自动执行你的登陆页。此登陆页的action要注意一下,必须是跳转到认证的地址。 (2)另外一个是授权页,让你勾选选项的页面。此页面可以参考源码里的实现,自己生成一个controller的类,再创建一个对应的web页面即可实现自定义的功能。 下面梳理一下授权获取token流程:(1)端口号换成你自己的认证服务器的端口号,client_id也换成你自己的,response_type类型为code。 localhost:8080/uaa/oauth/authorize?client_id=client&response_type=code&redirect_uri=http://www.baidu.com(2)这时候你将获得一个code值:http://www.baidu.com/?code=G0C20Z (3)使用此code值来获取最终的token: curl -X POST -H "Cant-Type: application/x-www-form-urlencoded" -d 'grant_type=authorization_code&code=G0C20Z&redirect_uri=http://www.baidu.com' "http://client:secret@localhost:8080/uaa/oauth/token" 返回值: {"access_token":"b251b453-cc08-4520-9dd0-9aedf58e6ca3","token_type":"bearer","expires_in":2591324,"scope":"app"} (4)用此token值来调用资源服务器内容(如果资源服务器和认证服务器在同一个应用中,那么资源服务器会自己解析token值,如果不在,那么你要自己去做处理) curl -H "Authorization: Bearer b251b453-cc08-4520-9dd0-9aedf58e6ca3" "localhost:8081/service2(此处换上你自己的url)" 四、Resource Server:保护资源,需要令牌才能访问在配置类上加上注解@EnableResourceServer即启动。使用ResourceServerConfigurer进行配置: (1)tokenServices:ResourceServerTokenServices的实例,声明了token的服务 (2)resourceId:资源Id,由auth Server验证。 (3)其它一些扩展点,比如可以从请求中提取token的tokenExtractor (4)一些自定义的资源保护配置,通过HttpSecurity来设置 使用token的方式也有两种: (1)Bearer Token(https传输方式保证传输过程的安全):主流 (2)Mac(http+sign) 如何访问资源服务器中的API? 如果资源服务器和授权服务器在同一个应用程序中,并且您使用DefaultTokenServices,那么您不必太考虑这一点,因为它实现所有必要的接口,因此它是自动一致的。如果您的资源服务器是一个单独的应用程序,那么您必须确保您匹配授权服务器的功能,并提供知道如何正确解码令牌的ResourceServerTokenServices。与授权服务器一样,您可以经常使用DefaultTokenServices,并且选项大多通过TokenStore(后端存储或本地编码)表示。 (1)在校验request中的token时,使用RemoteTokenServices去调用AuthServer中的/auth/check_token。 (2)共享数据库,使用Jdbc存储和校验token,避免再去访问AuthServer。 (3)使用JWT签名的方式,资源服务器自己直接进行校验,不借助任何中间媒介。 五、oauth client在客户端获取到token之后,想去调用下游服务API时,为了能将token进行传递,可以使用RestTemplate.然后使用restTemplate进行调用Api。 注: scopes和authorities的区别: scopes是client权限,至少授予一个scope的权限,否则报错。 authorities是用户权限。 以上是我从网上找到的一篇写的不错的博客,希望可以帮助大家快速了解OAuth2.0,下一篇文章我们正式介绍OAuth2.0在当前框架中的使用。 从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友,大家来一起探讨spring cloud架构的搭建过程及如何运用于企业项目。

优秀的个人博客,低调大师

分布式架构高可用架构篇_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试

样例视频教程可参考架构实战29-41节: http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53 从ActiveMQ 5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper + LevelDB的Master-Slave实现方式,其他两种方式目录共享和数据库共享依然存在。 三种集群方式的对比: (1)基于共享文件系统(KahaDB,默认): <persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter> (2)基于JDBC: <bean id="MySQL-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/amq?relaxAutoCommit=true"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name="maxActive" value="20"/> <property name="poolPreparedStatements" value="true"/> </bean> <persistenceAdapter> <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false"/> </persistenceAdapter> (3)基于可复制的LevelDB(本文采用这种集群方式): LevelDB是Google开发的一套用于持久化数据的高性能类库。LevelDB并不是一种服务,用户需要自行实现Server。是单进程的服务,能够处理十亿级别规模Key-Value型数据,占用内存小。 <persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62621" zkAddress="localhost:2181,localhost:2182,localhost:2183" hostname="localhost" zkPath="/activemq/leveldb-stores"/> </persistenceAdapter> 本文主要讲解基于ZooKeeper和LevelDB搭建ActiveMQ集群。集群仅提供主备方式的高可用集 群功能,避免单点故障,没有负载均衡功能。 官方文档:http://activemq.apache.org/replicated-leveldb-store.html 集群原理图: 高可用的原理:使用ZooKeeper(集群)注册所有的ActiveMQ Broker。只有其中的一个Broker可以提供 服务,被视为Master,其他的Broker处于待机状态,被视为Slave。如果Master因故障而不能提供服务, ZooKeeper会从Slave中选举出一个Broker充当Master。 Slave连接Master并同步他们的存储状态,Slave不接受客户端连接。所有的存储操作都将被复制到 连接至Master的Slaves。如果Master宕了,得到了最新更新的Slave会成为Master。故障节点在恢复后 会重新加入到集群中并连接Master进入Slave模式。 所有需要同步的disk的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所以,如果你配置了replicas=3,那么法定大小是(3/2)+1=2。Master将会存储并更新然后等待(2-1)=1个Slave存储和更新完成,才汇报success。至于为什么是2-1,熟悉Zookeeper的应该知道,有一个node要作为观擦者存在。当一个新的Master被选中,你需要至少保障一个法定node在线以能够找到拥有最新 状态的node。这个node可以成为新的Master。因此,推荐运行至少3个replica nodes,以防止一个node失败了,服务中断。(原理与ZooKeeper集群的高可用实现方式类似) 1、ActiveMQ集群部署规划: 环境:CentOS 6.6 x64、JDK7 版本:ActiveMQ 5.11.1 ZooKeeper集群环境:192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183 2、防火墙打开对应的端口 edu-zk-01: -A INPUT -m state --state NEW -m tcp -p tcp --dport 8161 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 51511 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 62621 -j ACCEPT edu-zk-02: -A INPUT -m state --state NEW -m tcp -p tcp --dport 8162 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 51512 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 62622 -j ACCEPT edu-zk-03: -A INPUT -m state --state NEW -m tcp -p tcp --dport 8163 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 51513 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 62623 -j ACCEPT 3、分别在三台主机中创建/home/yxq/activemq目录 # mkdir /home/yxq/activemq 上传apache-activemq-5.11.1-bin.tar.gz到/home/yxq/activemq目录\ 4、解压并按节点命名 # tar -xvf apache-activemq-5.11.1-bin.tar.gz #cd /home/yxq/activemq #tar -xvf apache-activemq-5.11.1-bin.tar.gz #mv apache-activemq-5.11.1 node-0X#(X代表节点号1、2、3,下同) 5、修改管理控制台端口(默认为8161)可在conf/jetty.xml中修改,如下: node-01管控台端口: <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <!-- the default port number for the web console --> <property name="host" value="0.0.0.0"/> <property name="port" value="8161"/> </bean> node-02管控台端口: <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <!-- the default port number for the web console --> <property name="host" value="0.0.0.0"/> <property name="port" value="8162"/> </bean> node-03管控台端口: <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <!-- the default port number for the web console --> <property name="host" value="0.0.0.0"/> <property name="port" value="8163"/> </bean> 6、集群配置: 在3个ActiveMQ节点中配置conf/activemq.xml中的持久化适配器。修改其中bind、zkAddress、hostname和zkPath。注意:每个ActiveMQ的BrokerName必须相同,否则不能加入集群。 所有节点中activemq.xml配置 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu" dataDirectory="${activemq.data}"> node-01中的持久化配置: node-02中的持久化配置: node-03中的持久化配置: 修改各节点的消息端口(注意,避免端口冲突): node-01中的消息端口配置: node-02中的消息端口配置: node-03中的消息端口配置: 7、按顺序启动3个ActiveMQ节点:(zookeeper集群已经启动) #/home/yxq/zookeeper/node-01/bin/zkSeerver.sh start #/home/yxq/zookeeper/node-02/bin/zkSeerver.sh start #/home/yxq/zookeeper/node-03/bin/zkSeerver.sh start # /home/yxq/activemq/node-01/bin/activemq start # /home/yxq/activemq/node-02/bin/activemq start # /home/yxq/activemq/node-03/bin/activemq start 监听日志: #tail -f /home/yxq/activemq/node-01/data/activemq.log #tail -f /home/yxq/activemq/node-02/data/activemq.log #tail -f /home/yxq/activemq/node-03/data/activemq.log 8、集群的节点状态分析: 集群启动后对ZooKeeper数据的抓图 ,可以看到ActiveMQ的有3个节点,分别是00000000000,00000000001,00000000002。 我这里是00000000005,00000000006,00000000007。 以下第一张图展现了000000000005的值,可以看到elected的值是不为空,说明这个节点是Master, 其他两个节点是Slave。 9.集群可用性测试 ActiveMQ的客户端只能访问Master的Broker,其他处于Slave的Broker不能访问,所以客户端连接的Broker应该使用failover协议(失败转移) failover:(tcp://192.168.1.81:51511,tcp://192.168.1.82:51512,tcp://192.168.1.83:51513)?randomize=false 10.集群高可用测试 当一个ActiveMQ节点挂掉,或者一个Zookeeper节点挂掉,ActiveMQ服务依然正常运转,如果仅剩一个ActiveMQ节点,因为不能选举Master,ActiveMQ不能正常运行:同样的,如果Zookeeper仅剩一个节点活动,不管ActiveMQ各节点存活,ActiveMQ也不能正常提供服务。(ActiveMQ集群的高可用,依赖于Zookeeper集群的高可用) 11.设置开机启动 #vi /etc/rc.local su - yxq -c '/home/yxq/activemq/node-01/bin/activemq start' su - yxq -c '/home/yxq/activemq/node-02/bin/activemq start' su - yxq -c '/home/yxq/activemq/node-03/bin/activemq start' 12.ActiveMQ集群测试 13、负载均衡集群 配置放在 集群 1链接集群 2: 集群 2链接集群 1: 集群2(伪集群)连接集群1配置 集群2(伪集群)端口放开 启动集群1(伪集群)启动 集群1连接集群2配置 集群2连接集群1配置 ActiveMQ集群负载均衡原理图 集群1,集群2负载均衡高可用测试: 消息生产者B 欢迎关注:

优秀的个人博客,低调大师

spring cloud互联网分布式微服务云平台规划分析--spring cloud服务监控中心

1.介绍 鸿鹄云架构【服务监控中心】提供简洁的可视化WEB UI,来管理 Spring Cloud 微服务应用程序。 2.平台基础功能 服务在线状态监控、Logging日志级别管理、JMX beans管理、Threads会话和线程管理、Trace应用请求跟踪 应用运行参数信息更多资源欢迎球911708498 Java 系统属性、Java 环境变量属性、内存信息、Spring 环境属性 Spring Cloud其他组件监控 如:当前处于活跃状态的会话数量、当前应用的并发数、延迟以及其他度量信息。可以根据业务需要进行定制 3.运行环境支持 开发工具:Eclipse、MyEclipse、Idea WEB容器:内置TomcatJDK版本:1.8+ 系统支持:Window、Linux 服务框架:SpringCloud、SpringBoot、SpringBoot Admin 构建方式:Maven、Jenkins 后面的章节我们详细介绍一下每个平台的使用和规划,希望可以帮助到大家!

优秀的个人博客,低调大师

民生银行牛新庄:单账户成本从2.2元降到8分,分布式架构重构银行IT

牛新庄 中国民生银行总行信息科技部总经理 民生科技有限公司执行董事、总经理 (本文根据牛新庄先生在2018云栖大会金融峰会上分享整理) 大家上午好,非常高兴参加本次“数字驱动中国”杭州云栖大会,今天主要跟大家交流在这样一个技术变革的时代,民生银行、民生科技有限公司在金融科技方面的探索。 数字驱动中国 今天我们身处一个数字的世界,一个以技术变革驱动各行各业的时代。例如制造行业,包括特斯拉、台积电等,我们很难把特斯拉定义为一家汽车制造商,更认为它是一家科技公司。随着5G的普及,未来工业和互联网会发生更进一步跨越式的发展,在物联网领域,虽然我们起步较晚,但是很多新技术的应用已经取得了不错的进展,零售、医疗、农业以及刚刚发布城市大脑2.0的智慧城市—杭州都在因科技而改变。实体领域的技术变革也驱动着金融行业的技术变革,作为“上层建筑”,只有与服务对象保

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册