上篇文章总结了《深入实践Spring Boot》的第一部分,这篇文章介绍第二部分:分布式应用开发,以及怎么构建一个高性能的服务平台。
主要从以下几个方面总结:
- Spring Boot SSO
- 使用分布式文件系统
- 云应用开发
- 构建高性能的服务平台
Spring Boot SSO
上篇文章提到了安全设计,使用Spring Security进行用户验证和权限验证,但一个企业级的应用系统可能存在很多应用系统,每个应用系统都需要设计安全管理,但不可能为每一个应用系统都设计一套安全管理,这样不但耗时耗力,而且要做重复的工作,也不适宜建立统一的用户中心。
可以使用单点登录SSO的方式建立一个登录认证系统,并且实现对用户的统一管理。本章在使用Spring Security安全管理的基础上,再结合OAuth2认证授权协议来实现的,它不但适用于大型的分布式管理系统,也适用于为第三方提供统一的用户管理和认证的平台。
作者给出了一个完整的实例,以模块化的设计方式进行实现,整个demo的代码可以在github上查看。(https://github.com/chenfromsz/spring-boot-sso)
demo说明
我在本地运行了demo,通过chrome查看了系统间跳转的过程,先说明下模块的划分,然后看下运行效果。
数据库管理模块 | mysql | 程序集成 | 数据库管理 |
安全配置模块 | security | 程序集成 | 安全策略配置和权限管理 |
登录认证模块 | login | Web应用 | SSO登录认证(80) |
共享资源模块 | resource | Web应用 | 共享资源(8083) |
客户端应用1 | web1 | Web应用 | 客户端1(8081) |
客户端应用2 | web2 | Web应用 | 客户端2(8082) |
访问首页时,跳转到登录页面,输入正确的账号、密码、验证码。
登录成功后,跳转到首页:
访问web1系统、web2系统时不需要重新登录,会自动登录:
「登录认证模块」主要包括验证用户账号、集成OAuth2服务端端功能。
「安全配置模块」是一个公共模块,集成了SSO客户端的安全策略配置和权限管理功能,供客户端引用。
「数据库管理模块」是一个公共模块,主要提供数据库的访问功能,供其他模块使用。
「共享资源模块」提供了一个简单的公共服务,2个客户端应用可通过spring-cloud-zuul直接调用。
后面会重点介绍下登录认证模块,其他模块比较简单,不再过多介绍。
模块化设计可以提高代码的复用性,避免重复开发,实例中的「数据库管理模块」和「安全配置模块」可以被其他模块共用,减少大部分重复工作。
作者的这种设计方式值得我们学习,在以后的系统设计中,应多借鉴这种方式。
登录认证模块
我画了一个流程图,先了解下用户认证、权限验证的基本过程:
整个处理流程,Spring Security都帮我们自动实现了,我们只需要对账号中心数据源、权限中心数据源进行配置和扩展,另外,可以对登录页面进行扩展,配置权限管理规则、防攻击策略、记住登录状态。
为了实现多个系统只需登录一次,需要集成OAuth2。添加spring-cloud-starter-oauth2依赖,编写一个配置类,继承AuthorizationServerConfigurerAdapter,并声明下@EnableAuthrizationServer来启用OAuth2的认证服务器功能。
OAuth2有很多授权机制,本例中使用authorization_code机制,具体配置就不过多说明了,可以参考下面的几篇文章:
[1] 初步理解Spring Security并实践
[2] security OAuth2.0 提供者实现原理
[3] jwt token介绍
[4] security OAuth2.0 jwt完美整合例子
使用分布式文件系统
有这样一个问题,如果上传文件,如上传图片,应该怎样保存,保存在哪里?
传统的做法一般都保存在Web服务器所在机器中。但随着业务的日益发展,可能上传的文件会累积越来越多,单台机器往往会不堪重负,再加上一些负载均衡的配置和服务,需要分布式文件系统解决。
在诸多分布式的文件系统中,FastDFS是比较优秀的分布式文件系统。FastDFS是一个完全开源的分布式文件系统,使用比较简单方便,而且性能也很优秀,存储容量和访问性能可按需求进行线性横向扩展。
FastDFS服务端和客户端的安排、配置、管理都比较简单,书中描述的也比较详细,就不在此赘述了。
云应用开发
Spring Cloud 是一套云应用开发工具集,为分布式的微服务开发提供了一整套简单易用的使用工具。Spring Cloud主要包括配置管理、服务发现、动态路由、负载均衡、断路器、安全管理、事件总线、分布式消息等组件的开发工具包。
Spring Cloud与Spring Boot 关系密切,能够臻于完美的几何使用。
本章重点介绍了配置服务、发现服务、动态路由和断路器、监控服务。
配置服务
一个项目工程总是需要一些配置,比如,要配置服务器的端口、访问数据库的参数等。一个大型的分布式系统可能存在很多这样需要配置的项目工程,配置管理是一个庞大的工程,需要一个单独的系统专门管理各个项目的配置。
通过Spring Cloud的配置管理,只需创建一个简单的工程,就可以实现分布式配置管理服务,同时还支持在线更新。
第一步,配置管理服务器
引入spring-cloud-config-server依赖,创建一个主程序:
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigApplication{
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
配置文件的存储目前支持使用本地存储、Git以及Subversion等方式。以Git方式为例,说明本地配置文件:
spring:
cloud:
config:
server:
git:
uri: https://github.com/chenfromsz/spring-cloud-config-repo
rabbitmq:
addresses: ${vcap.services.${PREFIX:}rabbitmq.credentials.uri:amqp://${RABBITMQ_HOST:192.168.1.215}:${RABBITMQ_PORT:5672}}
username: alan
password: alan
服务端会自动从指定的git地址获取配置信息。raabitmq的配置用于通知客户端应用配置更新。
第二步,配置管理的客户端
需要在工程中引入spring-cloud-starter-config依赖,使用配置管理服务之后,如果本地的配置文件与配置管理服务器的配置文件有相同的配置项,将优先使用配置管理服务器的配置项。
客户端的配置文件bookstrap.yml如下:
spring:
application:
name: data
profiles:
active: development
cloud:
config:
uri: http://localhost:8888
rabbitmq:
addresses: amqp://192.168.1.214:5672
username: alan
password: alan
其中,name用来指定应用的名称和配置文件的名称,uri设定配置服务服务端的地址和端口,profiles为使用配置文件名称的后缀部分,用于绑定不同的线上环境。
第三步,使用配置
如果配置文件中有cloud.config.test配置项,可以这样使用
@Value("${cloud.config.test:World!}") String msg;
另外,可以使用spring-cloud-bus-amqp依赖,通过事件总线的方式,实现在线更新所有客户端的配置。
发现服务
在分布式系统中,可能存在很多应用和服务,各个服务渎职自主地管理自身的数据。服务与服务之间,需要互相共享一些数据,传统的方式需要自己编写一些接口程序,还需要使用复杂的配置来实现,使用Spring Cloud可以轻易做到这些。
第一步,创建发现服务器
引入spring-cloud-starter-eureka-server依赖,创建一个简单的主程序即可:
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class, args);
}
}
第二步,创建客户端
引入spring-cloud-starter-eurake依赖,主程序中加入@EnableDiscoveryClient启用发现服务的客户端。
配置文件如下:
eureka:
instance:
hostname: discovery
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://192.168.1.221:${server.port}/eureka/
动态路由和断路器
如何在服务间相互调用呢,可以使用动态路由、断路器和故障容错等功能。
引入spring-cloud-starter-zuul、spring-cloud-starter-hystrix依赖,添加@EnableZuulProxy和@EnableHystrix注解即可。
为了便于测试,可以通过共享Rest资源将repository的类直接暴露出来,很神奇吧,如下:
@RepositoryRestResource(collectionResourceRel="users",path="users")
public interface UserRepository extends GraphRepository<User> {
User findByName(@Param("name") String name);
@Query("MATCH (u:User) WHERE u.name =~ ('(?i).*'+{name}+'.*') RETURN u")
Collection<User> findByNameContaining(@Param("name") String name);
}
可以通过http://localhost/users , http://localhost/users/123 之类的方式访问。
通过以下3种方式调用其他服务对外暴露的接口:
- JavaScript:前端直接调用
- RestTemplate:后端调用
- FeignClient:特殊方式
以RestTemplate为例说明一个服务调用data服务的例子:
@Autowired @LoadBalanced
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "getUserFallback")
public User getUserByName(String name) {
Map<String, Object> params = new HashMap<>();
params.put("name", name);
User user = restTemplate.getForObject("http://data/user/findByName?name={name}", User.class, params);
return user;
}
上面例子中使用了@HystrixCommand用于实现断路器,当一个系统服务突然出现故障时,会自动阻断对服务的访问和调用,转而调用备用方法。
监控服务
分布式服务系统中运行着很多服务,必须有一个管理机制和方法,能够一目了然地随时了解各个服务的运行情况及其健康指数。
使用Spring Cloud的监控服务,可以实时监控应用的运行情况。使用很简单,引入spring-cloud-starter-hystrix-dashboard依赖,创建一个主程序即可:
@SpringBootApplication
@Controller
@EnableHystrixDashboard
public class HystrixApplication{
@RequestMapping("/")
public String home() {
return "forward:/hystrix";
}
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
具体监控指标可参看官网文档。
构建高性能的服务平台
使用Spring Cloud开发的微服务,其独立而又相对隔离的特性,与Docker的理念有异曲同工之妙,所以使用Docker发布微服务,能够发挥其最大的优势,并且可以非常轻易地构建一个高性能和高可用的服务平台。
Docker可以很方便地创建和管理镜像,以及管理已经生成的和正在运行的容器。镜像是一种文件存储方式,可以把许多文件做成一个镜像文件。容器是镜像运行的一个实例,运行一个镜像,就会生成一个容器,容器生成之后,就可以在容器中管理应用系统了。
Docker的安装和发布服务,网上的资料很多,这里就不赘述了。
另外,可以使用其他一些服务管理工具来构建高性能和高可用的服务平台。docker-compose工具是Docker容器管理工具集,可以很方便地用来创建和重建容器、执行启动和停止容器等管理操作,以及查看整个服务体系的运行情况和输出日志等。使用docker-compose工具,只要一条指令就能启动整个分布式服务体系。
通过本篇文章的介绍,大家可以感受到Spring Cloud在构建分布式应用时提供的便捷性,减少了大量的工作量。同时为我们考虑了方方面面,增强了系统的稳定性、高性能。
作者把所有代码都上传到github,大家可以直接运行demo深入了解。
[1] Spring Boot SSO:https://github.com/chenfromsz/spring-boot-sso
[2] 云应用开发:https://github.com/chenfromsz/spring-boot-cloud
相关推荐
Spring Cloud是一个用于构建分布式系统的开源框架,它基于Spring Boot提供了丰富的工具和库,用于快速开发和部署分布式应用程序。以下是一份关于Spring Cloud的笔记的可能内容: --- ### Spring Cloud 笔记 #### ...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理...Spring Boot是用来简化Spring应用初始搭建以及开发过程的全新框架,被认为是Spring MVC的“接班人”,和微服务紧密联系在一起。
基于 Spring Boot 与 Spring Cloud 开发,采用微服务及分布式模式部署,集群使用 Kubernetes 进行管理。 容器化部署,同时采用 Kubernetes 对容器进行编排 Spring Boot 与 Spring Cloud 开发,并集成 Spring Cloud ...
1. Spring Boot:一个基于Spring框架的快速开发应用程序的工具。 2. Python Flask:一个轻量级的Python Web框架。 3. etcd:一个分布式键值存储系统,用于服务注册与发现。 三、项目设置 1. 创建一个新的Spring ...
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
使用SpringBoot开发的基于HBASE的大数据存储分布式云计算笔记(后端) 基于HBASE的大数据存储分布式云计算笔记 云笔记使用大数据成熟的分布式存储解决方案,解决了传统笔记数据日益膨胀,数据丢失等问题。云笔记通过...
Spring Cloud是一个基于Spring Boot的开发工具包,用于快速构建分布式系统和微服务架构。它提供了一系列的组件和工具,以简化分布式系统的开发和管理。 Spring Cloud的主要特点包括: 1. 服务注册与发现:Spring ...
SpringCloud笔记 1、前言 1.1、回顾 回顾之前的知识 JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot Dubbo、Zookeeper、分布式基础 Maven、Git Ajax、Json ... 串一下自己会的东西 数据库 ...
通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。 为什么使用Spring Boot?很简单,我仅仅只需要非常少的几个配置就可以迅速方便的搭建起来一套 Web 项目...
谷粒商城学习完成版pdf笔记,微服务分布式电商项目。主要包含SpringBoot,微服务介绍,项目搭建,vue讲解,webpack,elasticsearch,RabbitMQ,用户注册,授权,支付等操作具体细节见文档。
本视频《SpringBoot高级》属于下部,着重介绍SpringBoot的与各大场景的整合使用,内容包括:缓存(整合Redis),消息中间件(整合RabbitMQ)...分布式(整合Zookeeper/dubbo,整合SpringCloud),SpringBoot应用监管;
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有...
二、Spring Boot配置 十、Spring Boot与消息 三、Spring Boot与日记 十一、Spring Boot与检索 四、Spring Boot与Web开发 十二、Spring Boot与任务 五、Spring Boot与Docker 十三、Spring Boot与安全 六、Spring Boot...
2020年7月份PDF笔记,从Java基础内容到微服务、分布式相关笔记;
盈利宝是一个大型互联网金融项目(理财业务),作为全栈项目涵盖:前端、后端以及...适合从单一架构到分布式架构过渡阶段,熟悉Vue,Spring Boot,Dubbo框架, 想要进阶的同学们。以实际项目要求开发项目,非练习例子。
Spring boot(后续用*表示) helloworld * 返回 json 数据 * 使用其他 json 转换框架 * 全局异常捕捉 * JPA 连接数据库 * 配置 JPA * 整合 JPA 保存数据 * 使用 JdbcTemplate 保存数据 * 常用配置 * 静态资源处理 * ...
学习了自己通过 cookie 实现分布式session, 不使用spring boot默认提供的 知识点 数据库设计 明文密码两次md5处理 JSR303参数校验 + 全局异常处理器 分布式session, 通过cookie完成分布式session功能. 将cookie存放...
第一阶段: 快速地开发一个前瞻分离的电商系统Spring Boot + Spring Cloud + Vue + Docker + MyBatis Plus第二阶段: ,打通分布式开发中的所有技术栈。弹性搜索Redis基本使用与Lua脚本Redisson分布式锁性能压测模拟...
SpringCloud笔记 1、前言 1.1、回顾 回顾之前的知识 JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot Dubbo、Zookeeper、分布式基础 Maven、Git Ajax、Json ... 串一下自己会的东西 数据库 ...