专栏首页服务端思维SpringCloud开发框架入门知识

SpringCloud开发框架入门知识

1.分布式开发简介

  1. 分布式开发的思考点:如何可以让代码更安全;如何有效的通讯;

在进行分布式处理的时候如何进行程序功能划分;

  1. web集群:考虑多用户并发访问的处理速度。

业务中心:在进行一些庞大的项目设计过程之中,应该有更加完善的业务处理,这样所有的客户端(服务器),用这些业务中心的操作就可以完成具体的功能。

数据库集群:解决了数据的存储问题,以及数据的分片管理。

对于分布式的项目开发按照历史的发展经历过如下的一些技术:

CORBA:公共对象请求代理架构,它是一种开发的标准,而且也是许多语言都支持的开发标准。

RMI(远程方法调用):该技术是sun提出的,该技术出现的最大特征是希望可以与CORBA进行市场的竞争,于是这技术出现时,很多公司不认可这些技术。

2、RMI实现方案

用户->接口(存根)->接口及实现类(骨架)

发现RMI很好用,单不如CORBA广泛。后基于CORBA设计了RMI-IIOP协议,这个协议应用在了EJB上。

3.EJB思想

用户->WEB容器->EJB容器(WebSphere、WebLogic、JBoss)

优秀的理论,糟糕的实现。后因XML的出现,基于XML作为交互语言的WebService登场了。

4.Web服务及Soa服务思想

1、.Net 与java通过SOAP协议相互调用(WebService=XML+SOAP).

2、WebService技术开发,存在如下问题:

速度太慢了;

想要采用远程接口方式调用,就要利用开发工具生成一堆工具类代码;

3、基于上述SOA思想出现,即将所有的服务统一管理起来,就成了服务总线,那么所有的开发者直接调用里面的服务就完成一些功能。后来又不断出现了许多的RPC开发技术,其中国内具有代表性的dubbo开发技术,不过成长最快的Rest,因为JSON的广泛引用,就如同最初XML技术造就了WebService,JSON造就了Rest服务;

利用Rest进行RPC技术实现,这样的操作速度很快,而且占用的带宽要少,SpringCloud就将整个Rest作为了RPC实现技术,并且这一技术已经开始出现现有行业的统一之势。而且Spring Cloud依照Spring Boot开发技术,可以实现项目的打包发布以及单独运行,这一点符合当前云时代的开发要求。

5.微服务的缺点

SpringCloud整体核心架构只有一点:Rest服务,也就是说在整个SpringCloud配置过程之中,所有的配置处理都是围绕着Rest完成的,在整个Rest处理之中,一定要有两个端:服务的提供者(Provider)及服务的消费者(Consumer),所以对于整个SpringCloud基础结构就是如下所示:

用户-反向代理-Web微服务-(Restful即服务地址:端口)-微服务提供者

微架构缺点:只有业务层才能规划为微架构,

REST指的一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。满足这些约束条件和原则的应用程序或设计就是 RESTful。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

6.Feign-robbon-Eureka-Hystrix熔断处理机制

客户端(WEB)-注册中心-业务层-数据层-Mysql

Web端通过Nginx实现负载均衡,业务端通过在Eureka注册中心之中进行注册,通过robbon进行业务端负载均衡配置。通过feign伪造接口实现,将robbon伪造为接口。Hystrix熔断处理机制,保证某一个微服务即使出现了问题,依然可以正常使用。(原理为某个微服务出现问题,返回定义好的错误信息,而不是报错或无返回)

Feign-robbon-Eureka-Hystrix熔断处理机制

7.Zuul代理机制:

客户端-调用微服务X(RPC前端/springBoot)-Rest(zuul代理)-调用微服务X(RPC后端SpringCloud)-数据层-数据库。

通过Zuul代理的用户只需要知道指定路由的路径,就可以访问指定微服务信息,这样更好的体现了java中的“key=value”的设计思想,而且所有的微服务Zuul进行代理。

springCloud设计的时候提供有一个SpringCloudConfig程序组件,利用这个组件就可以直接基于GIT或SVN来进行配置文件的管理。

springBoot-zuul代理及Eureka注册服务-可通过GitHup管理的Config及微服务。

在整体设计上SpringCloud更好的实现了RPC架构,而且使用了Rest作为通讯的基础,且大量使用的netfix公司的产品技术,这些技术也有了可靠的保证。

8.Restful基础架构配置项目开发环境

对于rest基础架构实现处理是Springcloud核心所在。

创建一个microcloud的整体父pom项目,将创建三个子模块:microcloud-api子模块,作为公共的信息导入配置模块;microcloud-provider-dept-8001作为服务提供者,该提供者负责使用Mybatis与数据库的交互;

Microcloud-consumer-80:作为微服务调用的客户端使用。

  1. 创建一个新的maven项目:microcloud;
  2. 修改pom.xml文件,主要追加spring boot及Spring cloud两个开发包的依赖关系;

Ps:springCloud离不开springBoot,所以需要配置此依赖包。

  1. microcloud-api 建立一个api的公共模块,该模块的主要功能是提供有公共处理类,本次预计建立一个Dept数据表,里面的字段:

Deptno(long)、dname(String)、dbname(保存的数据库的名字)

  1. microcloud-provider-dept-8001

创建一个Rest提供者的项目模块,在这个模块主要定义要使用的数据库脚本;

由于在整个微服务里面需要进行负载均衡操作,所以我们本次在使用的时候加入了数据库的名称信息。

9.创建Dept微服务:

所谓微服务的核心本质就是JSON的传输,那么既然现在要求使用Mybatis进行数据库操作,所以应该在项目里面配置Druid的数据库连接池,而后对外进行项目的发布。

①microcloud-provider-dept-8001:修改pom.xml配置文件,追加相关的依赖程序支持包。
②microcloud-provider-dept-8001:创建IDeptDAO数据操作接口,这个接口里面将提供有三个数据操作方法。
③microcloud-provider-dept-8001:修改application.yml配置文件,追加mybatis和服务的相关配置信息;
④microcloud-provider-dept-8001:定义src/main/resources/mybatis/mybatis.cfg.xml配置文件:
⑤microcloud-provider-dept-8001:修改src/main/resources/mybatis/mapper/cn/mldn/Dept.xml配置文件;
⑥microcloud-provider-dept-8001:建立IDeptService接口,做业务实现:
⑦microcloud-provider-dept-8001:定义接口的运行主类。
⑧microcloud-provider-dept-8001:进行业务接口测试编写。
⑨microcloud-provider-dept-8001:建立DeptRest服务类。
@Controller
Public class DeptRest{
@ResquestMapping(value=“dept/get”,method=RequestMethod.GET)
Public Dept get(){
Return xx;
}
}
  1. 修改hosts配置文件,追加一个映射路径。

(C:\Windows\System32\drivers\etc\hosts)

追加“127.0.0.1 dept-8001.com”

  1. 观察Rest服务能否正常提供;

调用get操作;dept-8001.com:8001/dept/get/1;

调用list操作;调用add操作。

10.客户端调用微服务:

  1. 创建一个Maven的新的模块:microcloud-consumer-80
  2. microcloud-consumer-80:修改application.yml配置文件:
Server:
port:80
microcloud-consumer-80:创建一个Rest的配置程序类,主要进行RestTemplate类对象创建。
@Configuration
Public class RestConfig{
@Bean
Public RestTemplate getRestTemplate(){
Return new RestTemplate();
}
}
  1. microcloud-consumer-80:创建一个控制器,为了简化处理,本次不再进行页面定义,所有服务结果都使用REST返回。
  2. 编写启动程序类
  3. 修改hosts配置文件,追加访问控制路径。

127.0.0.1 client.com

7、进行代码测试调用

调用数据返回任务:http://client.com/consumer/dept/get?id=1?

11.1Rest提供者安全访问:

所有Rest服务最终都是暴露在公网,Rest访问,安全性是首要因素。

11.1配置安全验证

如果要想进行安全的验证处理,那么首先一定要先在服务提供方进行处理。

  1. 【microcloud-provider-dept-8001】修改pom.xml配置文件,追加SpringSecurity相关依赖包引入;

如果你现在配置了安全框架,则在启动时会出现如下提示信息:

Using default security password:73df5......

  1. Rest提供者安全访问配置

security:

Basic:

Enabled:true #启用springSecurity的安全配置项。

User:

name:mldnjava #认证用户名

password:hello #认证密码

role: #授权角色

随后在项目之中访问Rest服务接口http://client.com/consumer/dept/get?id=1?,此时在访问的时候会要求用户输入用户名与密码,这个时候有一个更简化方法进行内容的输入:http://mldnjava:hello@client.com/consumer/dept/get?id=1?

11.2SpringSecurity安全访问介绍

在安全的开发之中,对于Rest服务提供者不可能被用户直接访问的,所以肯定需要一个rest客户端springboot进行调用,可是现在Rest提供者的服务上有了认证信息,那么该如何访问呢?

如果这个时候在Rest客户端上直接使用用户名和密码做加密处理,那么根本无法访问,此时会出现有401的错误代码,因为认证出现了错误。是因为所有的认证的处理操作,应该以头信息的模式进行处理。而后使用base64进行加密处理后才可以得到一个正确的访问路径。

  1. 【microcloud-consumer-80】修改RestConfig配置类,在这个配置类上追加有新的bean配置项;
  2. 【microcloud-consumer-80】修改ConsumerDeptController配置类,在进行Rest访问的时候设置好这个头部的信息。
HttpHeaders headers = new HttpHeaders();
String auth=“user:password”
byte[] encodeAuth =Base64.getEncoder().encode(auth.getbytes(Charset.forName(“US-ASCII”)))
String authHeader = “basic ”+ new String(encodeAuth);
headers.set(“Authorization”,”authHeader”);

在进行授权的头信息内容配置的时候加密的信息一定要与“Basic ”之间有一个空格。

对于rest而言,在spring课程讲过,里面如果进行参数的传递,有各自方式,例如:各种页面的路径信息组成,如果要是传递复杂内容,建议你在整个处理的时候就去使用那些页面的参数传递模式。

11.3 无状态Session/rest配置

整个Rest项目中的一个问题所在,所有的Rest都是基于Http协议的应用,这种应用上所有的web容器一般都会提供有一个Session机制,也就是说每一个用户访问之后,如果该用户一直连接,则认为该用户一直被服务器保存状态,但微服务有可能并发访问几W或几十W人,那么如果所有的Session状态都被维护着?

  1. 【microcloud-provider-member-8001】现在修改Rest程序类,追加一个取得session id的方法

request.getSession().getId();

随后进行提供者的Rest连接访问,http://mldnjava:hello@dept-9=8001.com:8001/dept/sessionId:

  1. 在一个springCloud配置之中,默认是会保存有session状态的,而后如果用户有需要则可以根据“sessionCreationPolicy”枚举类进行不同的session状态设置,但是从整体的操作来说session最好设置为无状态(服务端不保存你的session状态)。

application.yml配置文件

Security:

Session:always(保存状态,服务器内存可能被占满)

Stateless(无状态)

不管你以后的项目或者支持类中是否有设置的无状态的问题,你最好都进行一下设置,否则你的Rest服务将受到严重的内存困扰,最严重的就是内存溢出。

12.定义安全配置程序类

在进行Rest服务开发的时候,为了保证安全所有的程序里面都需要进行Spring-Security安全认证处理,可是之前所进行的认证处理都是在application.yml配置文件完成的,这样配置明显不符合逻辑,如果你需要开发的微服务很多,这些微服务都要求使用统一的用户名和密码的时候就非常不方便了。所以现在最简单的做法是进行统一的设置。

  1. 创建一个microcloud-security的Maven模块
  2. 【microcloud-security】修改pom.xml配置文件
  3. 【microcloud-security】建立一个统一的安全配置类:
WebSecurityConfig extends WebSecurityConfigurerAdapter{
Public void config(HttpSecurity http)
{
//表示所有访问都必须进行认证处理后才能正常进行
http.httpBasic().add().authorizeRequest().anyRequest().fullyAuthenticated();
//所有的Rest服务一定要设置为无状态,以提升操作性能。
http.sessionManager().sessionCreationPolicy(SessionCreation.Policy.STATELESS);
}
}
【microcloud-provider-member-8001】修改pom.xml配置文件,引入安全配置模块
<dependency>
<groupId>cn.mldn<groupId>
<artifactId>microcloud-security<artifactId>
<dependency>

5、【microcloud-provider-member-8001】删除掉application.yml中与安全有关的配置项。

security:

Basic:

Enabled:true #启用springSecurity的安全配置项。

User:

name:mldnjava #认证用户名

password:hello #认证密码

role: #授权角色

由于现在所写的安全处理类是在程序启动类的子包之中,应该可以自动扫描到。

6访问地址:http://mldnjava@hello@dept-8001.com:8001/dept/sessionId

— 本文结束 —

本文分享自微信公众号 - 服务端思维(gh_c3775931ac9d)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 颠覆微服务认知:深入思考微服务的七个主流观点

    微服务架构现在已经成为了企业应用架构的必聊话题,本文沉淀了作者多年工作的所见所闻和实战思考,跳出纯技术的视角去思考架构,去看待微服务,保证利用现有的技术(工具)...

    用户2781897
  • 微服务到底该多大?如何设计微服务的粒度?

    微服务实践最常见的错误之一是把微服务做得过小。本文通过示例,深入讨论了微服务的大小和粒度。

    用户2781897
  • 微服务失败的 11 个原因

    微服务“很香”,它有许多优势,比如更快的开发、更好的可扩展性、更小的独立团队等等。但是,很多团队却在微服务上举步维艰,没有很好利用其优势。原因到底是什么?这是本...

    用户2781897
  • Django---ORM操作大全

    前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:...

    用户1214487
  • 关于MySQL varchar类型最大值,原来一直都理解错了

    关于MySQL varchar字段类型的最大值计算,也许我们一直都理解错误了,本文从问题出发,经实践验证得出一些实用经验,希望对大家的开发工作有些帮助~

    架构精进之路
  • Nodejs笔记(二)

    我是攻城师
  • 如何优雅地查看 JS 错误堆栈?

    在前端,我们经常会通过 window.onerror 事件来捕获未处理的异常。假设捕获了一个异常,上报的堆栈是这个:

    小芭乐
  • R语言︱大数据集下运行内存管理

    大神指导(http://bbs.pinggu.org/thread-3682816-1-1.html)

    素质
  • 20分钟了解微服务

    image.png 简介 所有的功能打包在一个war包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,...

    春哥大魔王
  • 服务框架的技术栈(作者:吊打我 96 年的表弟)

    随着业务规模的扩张,为了满足业务对技术的要求,技术架构需要从单体应用架构升级到分布式服务架构,来降低公司的技术成本,更好的适应业务的发展。分布式服务架构的诸多优...

    芋道源码

扫码关注云+社区

领取腾讯云代金券