Spring Cloud 上手实战-架构解析及实作

Spring简介

为什么要使用微服务

  • 单体应用:

目前为止绝大部分的web应用软件采用单体应用,所有的应用的用户UI、业务逻辑、数据库访问都打包在一个应用程序上。

在线制图 springCloud设计

缺点:

 开发相互干扰,随着应用的不断升级沟通协调成本增加 应用上线由于某个功能升级导致需要整体的构建、整体测试、整体发布 
  • 微服务
在线制图 springCloud设计

把单体应用拆分成小的、松藕合分布式服务的形式 
每个应用一定是独立构建、独立部署与测试,应用也是独立发布,应用于应用直接通常通过restful API接口的形式进行相互调用。 
解决了单体应用带来的困扰。 

Spring cloud 是什么

发展历史

  1. 2002,Rod Johonson发表了<<Expert One-on-One J2EE Design and Development>>,
  2. 包含了3万行的代码在包com.interface21中
  3. 2003,Juerge Hoeller,Yann Caroff 联系Rod,将书中代码开源,Yann提出Spring这个词,冠于书中代码;
  4. 并发布0.9,使用Apache 2.0协议;Thomas Risberg负责Spring JDBC;Ben Alex将Acegi Security贡献给Rod和Juergen
  5. 2004,1.0发布
  6. 2005,<<Professional Java Development with Spring Framework>> <<Pro Spring>>出版;1.2.6发布。
  7. AspectJ Leader Adrian Coyler加入Interface21作为首席科学家;
  8. 2006,Security 1.0、Spring webflow 1.0发布;Spring 2.0发布;
  9. 2007,Spring Batch、WebService、Integration发布;Spring 2.5发布;
  10. 2008,Spring Integration 1.0,Spring 2.5.6,Spring Batch 1.0;买了g2One,一家提供Groovy and Grails的公司;
  11. 2009,被VMWare发了42亿美金买下;Spring Python、STS发布、3.0发布(将包拆开,不提供超级包),买了Cloud Foundry;
  12. 2010,VMWare买了RabbitMQ公司,获得RabbitMQ和Redis技术;
  13. 2011,Spring 3.1、Spring AMQP、Spring Data JPA、Spring-data-common 1.0
  14. 、Spring Data Redis、Spring Data Mongodb发布;
  15. 2012,Rod Johnson离开VMWare;Spring Android、Mobile发布;
  16. 2013,VMWare 和 EMC 合力组建了一家公司,Pivotal。Spring 4.0、Spring Boot发布;
  17. 2014,Spring 4.1.3、SpringBoot 1.0发布;
  18. 2015,Spring 4.2、4.3发布;
  19. 2016,Spring 4.3 GA
  20. 2017,Spirng 5.x

Spring的出现让EJB等重量级的容器技术逐渐走向末路。 
Spring 通过对Bean的生命周期的管理,可以快速方便的实现业务的逻辑处理。 
Spring 可以方便的整合几乎所有的主流的开源项目如JPA,缓存,消息组合等等,方便的进行开发。

Spring Cloud实战

本实战目的: 
全程演示如何创建一个基础的、可用的Spring cloud分布式应用系统 
演示Spring Cloud各部分组件如何在应用之前协调、调用。 
了解整个Spring Cloud的项目基本情况,有一个初步的认识。 
本实战JAVA采用JDK8 
Spring Boot版本采用最新2.1.0 release. 
Spring Cloud版本采用Greenwich.M1。

2.2.1. Spring Cloud基础搭建

使用

阿里云的spring cloud 架构图在线设计地址: https://www.freedgo.com 即可使用Freedgo Desing 进行图形设计.

架构预览地址:

https://www.freedgo.com/draw_index.html?#Uhttps://www.freedgo.com/templates/network/springcloud_aliyun.xml

Freedgo Design 是一in款在线绘制专业图形的网站。Freedgo Design可以绘制各种类型的图形,针对业务逻辑的流程图,软件设计ER模板,工作流,各种云平台的系统部署架构图包括阿里云、AWS云、腾讯云、Oracle、Asure云、IBM云平台等。

在线制图 springCloud设计
2.2.1.1. 建立基础代码

开发工具:Intellij idea 
1、 建立一个mvn 工程项目 
使用的java jdk 采用jdk8

2.2.1.2. 服务发现
在线制图 springCloud设计
在线制图 springCloud设计
在线制图 springCloud设计
在线制图 springCloud设计

建立子模块discovery-service

在线制图 springCloud设计
在线制图 springCloud设计
在线制图 springCloud设计
在线制图 springCloud设计

我们可以看到mvn 依赖导入了netflix-eureka-server 
Spring boot 会启动服务发现服务

<dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency> 
2.2.1.3. 服务配置
在线制图 springCloud设计
在线制图 springCloud设计
在线制图 springCloud设计

建立子模块config-service

<dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-config-server</artifactId></dependency> 

2.2.1.4. 服务路由

在线制图 springCloud设计
在线制图 springCloud设计
在线制图 springCloud设计

服务路由采用 Netflix Zuul 
通过服务路由作为eureka client,可以被发现服务监控

<dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency> 

基础的组件创建完毕

2.2.1.5. 用户认证中心

在线制图 springCloud设计
在线制图 springCloud设计

2.2.1.6. 业务服务模块

在线制图 springCloud设计
在线制图 springCloud设计


org.springframework.boot
spring-boot-starter-web


org.springframework.cloud
spring-cloud-starter-oauth2


org.springframework.cloud
spring-cloud-starter-security

2.2.2. 服务发现

在线制图 springCloud设计

传统服务发现方式通过网络DNS和负载均衡设备实现,需要网络和硬件设置支持,维护成本高,网络环境复杂 
居于云的服务发现具有如下优点 
高可用,热部署 
负载均衡 
健康检查,容错机制 
抽象服务的逻辑名称 
使用Spring与Netflix Eureka实现服务发现 

实现服务发现功能需要配置服务发现端及需要注册服务配置客户端 
1、 发现服务端配置 
服务注册需要30 s 的时间才能显示在 Eureka 服务中,因为 Eureka 需要从服务接收3次连续心跳包 ping,每次心跳包 ping 间隔10 s,然后才能使用这个服务。在部署和测试服务时,要牢记这一点。 
application.yml

server:
port: 8761
# Eureka 服务器将要监听的端口
eureka:
client:
registerWithEureka: false #不要使用 Eureka 服务进行注册
fetchRegistry: false #不要在本地缓存注册表信息

使用一个新的注解 @EnableEurekaServer ,就可以让我们的服务成为一个 Eureka 服务

2、 服务发现客户端配置 
以config-service为例 
需要做2件事情 
1、 成为服务发现的客户端


org.springframework.cloud
spring-cloud-starter-netflix-eureka-client

2、 配置application.yml(对应config-server来说我们只需要配置如下)

spring:  cloud:    config:      discovery:        enabled: true 

启动运行查看

在线制图 springCloud设计
在线制图 springCloud设计

http://localhost:8761/eureka/apps/config-service。 
应用作为服务发现的客户端设置 
1、 添加客户端依赖


org.springframework.cloud
spring-cloud-starter-netflix-eureka-client

2、 配置application.yml

spring:
application:
name: business_service
eureka:
instance:
preferIpAddress: true
#注册服务的 IP,而不是服务器名称
client:
registerWithEureka: true #向 Eureka 注册服务
fetchRegistry: true
serviceUrl: #拉取注册表的本地副本
defaultZone: http://localhost:8761/eureka/ #Eureka 服务的位置

同样通过mvn spring-boot:run 打开 http://localhost:8761 ,business_service已经注册成功

使用服务发现查服务

2.2.3. 用户认证中心

在线制图 springCloud设计

OAuth2协议说明:

整体OAuth协议包括两方面: 
1、 访问授权:用户必须通过授权获取令牌 
2、 资源权限:通过授权的用户访问受保护的资源,根据定义访问权限来决定是否可以访问资源 
配置说明: 
启用OAuth授权服务 
增加 @EnableAuthorizationServer 用于告诉 Spring Cloud,该服务将作为 OAuth2 服务

package com.yuaoq.train.business;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
@SpringBootApplication
@EnableResourceServer
@EnableAuthorizationServer
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

OAuth访问授权配置,配置注册的客户端应用程序

@Configuration
public class Auth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private UserDetailsService userDetailsService;
// 覆盖 configure()方法。这定义了哪些客户端将注册到服务
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient(“yuaoq”)
.secret(“{noop}secret”)
.authorizedGrantTypes(
“refresh_token”,
“password”,
“client_credentials”)
.scopes(“webclient”,”mobileclient”);
}
// 该方法定义了 AuthenticationServerConfigurer 中使用的不同组件。这段代码告诉 Spring 使用 Spring 提供的默认验证管理器和用户详细信息服务
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
endpoints
.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService);
}
}

配置用户权限

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Override
@Bean
// AuthenticationManagerBean 被 Spring Security 用来处理验证
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
// Security 使用 UserDetailsService 处理返回的用户信息,这些用户信息将由 Spring Security 返回
@Override
@Bean
public UserDetailsService userDetailsServiceBean() throws Exception {
return super.userDetailsServiceBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//  configure()方法是定义用户、密码和角色的地方
auth.inMemoryAuthentication()
.withUser(“admin”)
.password(“{noop}password”)
.roles(“ADMIN”,”USER”)
.and()
.withUser(“anyone”)
.password(“{noop}password”)
.roles(“USER”);
}
}

获取用户信息(提供给其他服务获取用户信息使用)

@GetMapping(value = “/auth/user”)
public Map user(OAuth2Authentication user) {
Map userInfo = new HashMap<>();
userInfo.put(“user”, user.getUserAuthentication().getPrincipal());
userInfo.put(“authorities”, AuthorityUtils.authorityListToSet(user.getUserAuthentication().getAuthorities()));
return userInfo;
}

在线制图 springCloud设计

通过postman测试 
 
自此提供了一个用户认证的微服务模块.

2.2.3.1. 业务模块微服务

1、 对外提供restful Api 
@RestController :由spring web提供的居于restful 的接口标签 
生成一个restful api

@PostMapping(“/list”)
public ResponseEntity> getBusiness() throws Exception {
List list = new ArrayList();
list.add(“a”);
list.add(“b”);
return Optional.of(list)
.map(a -> new ResponseEntity>(a, HttpStatus.OK))
.orElseThrow(() -> new Exception(“error”));
}

使用postman调用接口

在线制图 springCloud设计

 
从postman返回的结果可以看到401,未授权。 
因为business_service服务引入了spring-cloud-starter-security 那么默认是会对所有访问做安全控制。

在线制图 springCloud设计

2、 服务的授权保护 
现在business/list 是未授权,那怎么配置一个受保护的oauth2.0资源,通过如下步骤 
设置服务是一个受oauth保护的资源 
 
定义应用的OAuth属性定义回调 URL

security:  oauth2:    resource:      user-info-uri: http://localhost:8282/auth/user 

定义授权用户可以访问

@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
//  antMatchers()允许开发人员限制对受保护的 URL 和 HTTP DELETE 动词的调用
// hasRole()方法是一个允许访问的角色列表,该列表由逗号分隔
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(HttpMethod.POST, “/api/v1/business/**”)
.hasRole(“ADMIN”)
.anyRequest()
.authenticated();
}
}

在线制图 springCloud设计

该段代码说明具有ADMIN角色的用户可以访问/api/v1/business/ 下的所有的POST 请求 
验证如下: 

至此通过OAuth2.0保护微服务的基本做法已经完成。

2.2.4. 服务路由网关 
服务网关:服务客户端不再直接调用服务。取而代之的是,服务网关作为单个策略执行点(Policy Enforcement Point,PEP),所有调用都通过服务网关进行路由,然后被路由到最终目的地。 
@EnabeZuulServer 使用此注解将创建一个 Zuul 服务器,它不会加载任何 Zuul 反向代理过滤器,也不会使用 Netflix Eureka 进行服务发现.

在线制图 springCloud设计

成为一个服务网关步骤: 
1、 添加 @EnableZuulProxy 
 
2、 在application.yml添加route 规则

zuul:  sensitive-headers: set-cookies  routes:    business_service: /busi/** 

通过postman测试如下:

在线制图 springCloud设计
Image placeholder
qcth
未设置
  19人点赞

没有讨论,发表一下自己的看法吧

推荐文章
金融行业微服务架构解析

转载本文需注明出处:微信公众号EAWorld,违者必究。引言:对于微服务,每个人都有自己的理解,与互联网企业的大量落地相比,微服务在传统金融行业还没有普及,这首先是传统金融行业线上系统需求更新和版本迭

Spring-SpringAOP原理,手写Spring事务框架

一、Spring核心知识Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson在其著作ExpertOne-On-OneJ2EEDevelopm

工商银行MySQL数据库架构解密

本文根据DTCC数据库大会分享内容整理而成,将介绍工行IT架构转型中传统OLTP数据库架构面临的挑战和诉求,构建基于MySQL分布式企业级解决方案实践历程,包括技术选择、高可用设计、两地三中心容灾、运

Spring Cloud Stream整合Kafka

引入依赖 org.springframework.cloud spring-cloud-stream-binder-kafka 或 org.springframework.cloud spr

基于Redis实现Spring Cloud Gateway的动态管理

引言:SpringCloudGateway是当前使用非常广泛的一种API网关。它本身能力并不能完全满足企业对网关的期望,人们希望它可以提供更多的服务治理能力。但SpringCloudGateway并不

Spring Cloud Alibaba 教程 | Nacos(四)

Nacos环境隔离Nacos管理台有一个单独的菜单“命名空间”,里面默认存在一个名为“public”的默认命名空间,我们在使用Nacos时不管是作为注册中心还是配置中心,都是作用在该命名空间之下的,那

Spring Cloud Alibaba 教程 | Nacos(五)

扩展配置(extendedconfigurations)通过之前的学习,我们知道应用引入nacos配置中心之后默认将会加载DataID=${prefix}-${spring.profiles.acti

宜信开源|微服务任务调度平台SIA-TASK入手实践

引言最近宜信开源微服务任务调度平台SIA-TASK,SIA-TASK属于分布式的任务调度平台,使用起来简单方便,非常容易入手,部署搭建好SIA-TASK任务调度平台之后,编写TASK后配置JOB进行调

SpringBoot个人应用开发框架(SpringBoot版本2.1)+IDEA

前言: 此笔记为本人首个SpringBoot项目框架学习实践记录,期间参考了许多大神的笔记和心得。 参考文档如下: 项目git地址: 一、创建SpringBoot工程 1.1创建父POM工程结

搭建 Spring+SpringMVC+MyBatis 框架

SSM框架整合 pom中添加依赖 添加编辑Spring配置文件 添加编辑SpringMVC配置文件 添加编辑Mybatis配置文件 配置web.xml 1、pom中添加依赖 junit ju

再见 Spring Boot 1.X ,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring官方在其博客宣布,SpringBoot1.x停止维护,SpringBoot1.x生命周期正式结束。其实早在2018年7月30号,Spring官方就已经在博客进行过预告,

面试问烂的 Spring AOP 原理、SpringMVC 过程

  正文  SpringAOP,SpringMVC,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以。但今天笔者带大家一起深入浅出源码,看看他的原理。以期让印象更加深刻,面试的时候游刃有余。

BAT大牛推荐开发人员必备Spring源码剖析文档,深度剖析Spring

为什么学习读源码我们每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。

揭秘青云QingCloud第二代云主机性能提升4倍的背后

前不久,青云QingCloud正式推出第二代企业型云主机,其搭载第二代英特尔至强可扩展处理器,采用独享CPU模式,可提供更高更稳定的计算性能,并针对人工智能工作负载进行优化,性能提升400%,满足企业

万字详解Oracle架构、原理、进程,学会世间再无复杂架构

学习是一个循序渐进的过程,从面到点、从宏观到微观,逐步渗透,各个击破,对于Oracle, 怎么样从宏观上来理解呢?先来看一个图,这个图取自于教材,这个图对于从整体上理解ORACLE 的体系结构组件,非

七牛云许式伟:当 Cloud 遇上 AI

从2014年起,中国人工智能产业的创业潮就开始兴起,直至2018年,机器学习、深度学习、大数据等能力的增强,促进了计算机视觉以及应用平台等技术的不断突破。随着人工智能在我国移动互联网、智能家居、智能

解密:华为CloudLink视讯引领行业的“金刚钻”

“华为新一代CloudLink视讯解决方案,完全基于鲲鹏+昇腾双引擎打造的全新平台、全系列智能协作终端等一系列新产品,未来华为视讯平台将全部更新换代。”华为IT产品线企业通信领域总裁孙权在接受IT16

拐点已至,阿里云进入All in Cloud全面上云时代!

当新旧设备交替势不可挡,当云的基础设施开始超过传统的数据中心,一个新时代开始了。在这样的时代里,以数据、计算、智能为主要特征的新一代信息技术,开始成为企业数字化转型的核心动力。对于所有云服务商来说,就

谷歌云重磅推出混合云平台Anthos,兼容竞争对手云服务 | Google Cloud Next’19

大数据文摘出品作者:蒋宝尚、周素云当地时间4月9日,谷歌云年度盛会GoogleCloud Next’19在旧金山的Moscone召开。在会上,谷歌云的新任CEO,曾经的甲骨文二号人物ThomasKur

AWS在中国开通三个CloudFront站点,可降31%的延迟

4月23日,北京消息,亚马逊旗下公司AmazonWebServices,Inc.(AWS)今天宣布,通过与宁夏西云数据科技有限公司(简称西云数据)协作,在中国开通三个由西云数据运营的AmazonClo

apicloud如何打包vue项目?

apicloud如何打包vue项目?APICloud新建项目后,会生成以下目录结构其中index.html是入口文件,而vue-cli打包生成的文件是在dist目录下├─dist │└─static

LeanCloud 2019 回顾

在过去的一年里,数万新用户选择了LeanCloud,开发者在我们的平台上创建了数万新应用。尽管在6月遇到了一些因外部因素带来的困难,2019年仍然是LeanCloud实现整体盈利的第一年。这离不开用户

架构转型先行——金融业务场景下的新一代架构实践

  赵勇中国农业银行研发中心架构管理办公室主任工程师中国农业银行研发中心架构管理办公室主任工程师,十年以上金融行业信息化架构设计与管控经验。历经互联网金融、两地三中心、分布式核心银行等大型银行系统工程

数字转型 架构演进 2019中国系统架构师大会盛大召开

2019年10月31日~11月2日,由IT168旗下ChinaUnix社区主办的第十一届中国系统架构师大会(SACC2019)在北京隆重召开。自2009年举办以来,大会云集了国内CTO、研发总监、高级

阿里支付宝架构师:谈谈我眼中的高并发架构【好文】

来源:my.oschina.net/u/3772106/blog/1793561前言高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等。为了让业务可以流畅的运行并且