Spring Cloud 微服务漫游

微服务是松耦合的分布式软件服务,这些服务执行 少量的 定义明确的任务。 ——《Spring微服务实战》

对微服务的认识

之前做项目,代码都是在一个工程里面,所有代码写完后,打一个 jar 包或 war 包,就放到服务器上面去跑了,这叫做单体架构。如果项目中有一点点需要修改,我们不得不整个工程重新编译打包,再重新部署。现在,我们决定用分布式和集群的方式,把业务功能拆分成多个子项目(服务),子项目可以单独运行,子项目与子项目之间暴露 http 或 rpc 接口,供外部或内部其他服务调用,然后,用一套规范的方式把众多子项目管理起来,这就是微服务架构。

Spring Boot 就是用于快速构建单个微服务的框架,而 Spring Cloud 则是各个微服务的管理者。

阅读更多

Spring(八)SpringBoot 集成 JPA

什么是 JPA ?

之前在 Spring Boot 工程中,一直用 Mybatis 注解方式作为持久层框架。但是 Mybatis 需要手写 SQL 语句,对于简单的项目稍显麻烦。最近发现了 JPA ,使用 JPA 我们几乎可以不用写一句 SQL 语句,非常适合 CURD 场景。JPA 是 Java Persistence API(Java持久化接口) 的缩写。JPA 让我们的应用程序以统一的方式访问持久层。JPA 是 Hibernate 的一个抽象,是一种 ORM 规范,是可以理解为是 Hibernate 功能的一个子集。

阅读更多

Spring(七)深入理解Spring MVC

我们通过 Spring Boot 来创建一个 Web 应用,发挥作用的是 Spring MVC 框架。当我们在IDE里敲入以下代码时,究竟发生了什么呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@GetMapping("/")
public String hello() {
return "login";
}

@PostMapping("/login")
public ModelAndView login(LoginData loginData) {
if (LOGIN.equals(loginData.getLogin())
&& PASSWORD.equals(loginData.getPassword())) {
return new ModelAndView("success",
Collections.singletonMap("login", loginData.getLogin()));
} else {
return new ModelAndView("failure",
Collections.singletonMap("login", loginData.getLogin()));
}
}
阅读更多

使用 JWT 进行认证

什么是 JWT ?

JWT 的全称是 JSON Web Token,是一种跨域认证解决方案。

所谓认证,就是获取用户的身份信息。我们知道,Http 是一种无状态协议,为了实现认证和跟踪用户信息,开发者发明了 cookie-session 方案,该方案流程如下:

  1. 用户向服务器发送用户名和密码;
  2. 服务器验证通过后,在 session 里保存相关数据;
  3. 服务器返回一个 session_id,写入客户端的 Cookie;
  4. 之后,用户的每次请求都会通过 Cookie 把 session_id 传回给服务器;
  5. 服务器通过 session_id,找到先前保存的数据,得到用户信息。

这种方案存在几个问题:

  1. 如果是服务器集群,要求 session 数据要共享,要求每一台服务器都能够读取并同步 session;
  2. 前后端分离,跨域访问的情况下,每次请求的 session_id 都会不一样;
  3. 如果是多端(ios/Android/Web)共用一套后端 API 服务,移动端无法储存 Cookie,需要另辟蹊径。
  4. session 数据是保存在服务器的内存中,无形中增加了服务器的压力。

而 JWT 解决了上述问题,它的思想是:服务器不保存 session 数据了,数据全部保存在客户端,每次请求的时候都发回服务器验证。

阅读更多

Spirng(六) IoC容器探究

Spring

Spring(一)从 传统Java Web到SpirngBoot 中对 Ioc 的概念已经有了初步认识:Spring 通过一个配置文件描述 Bean 与 Bean 之间的依赖关系,利用 Java 的类加载器和反射机制实例化 Bean 并建立 Bean 之间的依赖关系。

我们将调用类对某一接口实现类的依赖关系交由 Spring 容器管理,容器在我们需要的时候,通过注入及时地将对象进行实例化并装配好 bean,无需我们自己 new 。

除此之外,由于JDK提供的访问资源的类对底层资源并不友好,缺少从类路径或者Web容器的上下文获取资源的操作类,Spring重新设计了一个 Resource 接口,用于更强的底层资源访问能力。有了这个资源类,就可以将Spring的配置信息放在任何地方(数据库、LDAP)。而为了访问不同类型的资源,Spring还提供了一个强大的加载资源的机制,定义了一套资源加载的接口 ResourceLoader 及其实现类,可以访问包括classpath:file:http://ftp://等地址前缀资源。

这一篇具体讲讲关于 Spring Ioc的更多内容。

阅读更多

Spring(五)使用 Thymeleaf 模板引擎

thy

什么是 Thymeleaf

Thymeleaf的官方定义为

Thymeleaf is a modern server-side Java template engine for both web and standalone environments。

简单地讲,Thymeleaf 是一种现代的Java服务器端模板引擎。可以达到和JSP一样的效果,但是比起JSP对于前端测试更加友好。JSP需要运行起来才能看到效果,而 Thymeleaf 本身就是html格式,无需服务器也能看到效果。

阅读更多

Spring(四)使用 RESTful 风格

RESTful

什么是 RESTful ?

REST这个词由 Roy Thomas Fielding 在他2000年的博士论文中提出。全称是 Representational State Transfer ,这个词省略了主语 Resource,因此翻译成中文是:资源表述性状态转化。

资源(Resource)

之前在 HTTP之旅 一文中提到过,一个 Web 页面包含了很多对象,这些对象可以是 html ,可以是 JSON、XML,或者可以是图片、嵌入的视频,还可以是java小程序等等。这些对象都可以称为资源。我们通过 统一资源定位符(URI)去定位资源。

表述性(REpresentational)

正如上面提到的,资源可以用各种形式来进行表述,我们可以使用最适合资源使用者的任意形式来表述资源。资源具体呈现出来的形式,就是资源的表述性(REpresentational)。

状态转化(State Transfer)

HTTP协议是无状态协议。这意味着,资源的所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。

客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

简单总结:资源通过 URL 进行识别和定位,然后通过行为(即 HTTP 方法)来定义应该完成怎样的功能。

阅读更多

JSON初探

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于在客户端和服务器之间传递数据。

JSON 类似下面这样:

1
{"id":4,"name":"梅西","pwd":"6666"}

JSON 的优点:

  • 轻量级交互语言
  • 结构简单
  • 易于解析
阅读更多