SpringCloud学习
软件架构演进之路
对于单体架构,我们根据设计期和开发实现期的不同模式和划分结构,可以分为:
简单单体模式:
代码层面没有拆分,所有的业务逻辑都在一个项目(Project)里打包成一个二进制的编译后文件,通过这个文件进行部署,并提供业务能力;
MVC 模式:
系统内每个模块的功能组件按照不同的职责划分为模型(Model)、视图(View)、控制器(Controller)等角色,并以此来组织研发实现工作;
前后端分离模式:
将前后端代码耦合的设计改为前端逻辑和后端逻辑独立编写实现的处理模式;
组件模式:
系统的每一个模块拆分为一个子项目(SubProject),每个模块独立编译打包成一个组件,然后所有需要的组件一起再部署到同一个容器里;
类库模式:
A 系统需要复用 B 系统的某些功能,这时可以直接把 B 系统的某些组件作为依赖库,打包到 A 系统来使用。
分布式架构
我们根据设计期的架构思想和运行期的不同结构,可以分为:
面向服务架构(Service Oriented Architecture):以业务服务的角度和服务总线的方式(一般是 WebService 与 ESB)考虑系统架构和企业 IT 治理;
分布式服务架构(Distributed Service Architecture):基于去中心化的分布式服务框架与技术,考虑系统架构和服务治理;
微服务架构(MicroServices Architecture):微服务架构可以看做是面向服务架构和分布式服务架构的拓展,使用更细粒度的服务(所以叫微服务)和一组设计准则来考虑大规模的复杂系统架构设计。
也有人把如上的各个架构风格总结为四个大的架构发展阶段:
(1)单体架构阶段
比如典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。
1、特点
(1)所有的功能集成在一个项目工程中。
(2)所有的功能打一个war包部署到服务器。
(3)应用与数据库分开部署。
(4)通过部署应用集群和数据库集群来提高系统的性能。
此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
2、优点
项目架构简单,前期开发成本低,周期短,小型项目的首选。
3、缺点
(1)全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。
(2)系统性能扩展只能通过扩展集群结点,成本高、有瓶颈。
(3)技术栈受限。
(2)垂直架构阶段
1、特点
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
此时用于加速前端页面开发的Web框架(MVC)是关键。
典型的Java Spring mvc或者Python Django框架的应用。
2、优点
(1)项目架构简单,前期开发成本低,周期短,小型项目的首选。
(2)通过垂直拆分,原来的单体项目不至于无限扩大。
(3)不同的项目可采用不同的技术。
3、缺点
(1)全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。
(2)系统性能扩展只能通过扩展集群结点,成本高、有瓶颈。
(3)SOA 架构阶段
1、SOA即面向服务的架构,如dubbo。
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
2、优点
(1)把模块拆分,使用接口通信,降低模块之间的耦合度。
(2)把项目拆分成若干个子项目,不同的团队负责不同的子项目。
(3)增加功能时只需要在增加一个子项目,调用其它系统的接口就可以。
(4)可以灵活的进行分布式部署。
3、缺点
系统之间交互需要使用远程通信,接口开发增加工作量。
(4)微服务架构阶段
微服务是一种架构风格。一个大型的复杂软件应用,由一个或多个微服务组成。系统中的各个微服务可被独立部署,并且各个微服务之间是松耦合的,服务内部是高内聚的。每个微服务仅关注于完成一件任务并很好的完成该任务。
1、特点
(1)将系统服务层完全独立出来,并将服务层抽取为一个一个的微服务。
(2)微服务遵循单一原则。
(3)微服务之间采用RESTful等轻量协议传输。
2、优点
(1)服务拆分粒度更细,有利于资源重复利用,提高开发效率。
(2)可以更加精准的制定每个服务的优化方案,提高系统可维护性。
(3)微服务架构采用去中心化思想,服务之间采用RESTful等轻量协议通信,相比ESB(企业级服务总线)更轻量。
(4)适用于互联网时代,产品迭代周期更短。
3、缺点
(1)微服务过多,服务治理成本高,不利于系统维护。
(2)分布式系统开发的技术成本高(容错、分布式事务等),对团队挑战大。
了解Spring Cloud
①Spring Cloud 是一系列框架的有序集合。
②Spring Cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来。
netflix eureka 1.1,alibaba 2.2
③通过 Spring Boot 风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
④它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、
断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。⑤Spring Cloud项目官方网址:https://spring.io/projects/spring-cloud
⑥Spring Cloud
版本命名方式采用了伦敦地铁站的名称,同时根据字母表的顺序来对应版本时间顺序,比如:最早的Release版本:Angel,第二个Release版本:Brixton,然后是Camden、Dalston、Edgware,Finchley,Greenwich,Hoxton。
springCloud与dubbo
相同点:Spring Cloud 与 Dubbo 都是实现微服务有效的工具。
不同点:
1Dubbo 只是实现了服务治理,而 Spring Cloud 子项目分别覆盖了微服务架构下的众多部件。
2Dubbo 使用 RPC 通讯协议,Spring Cloud 使用 RESTful 完成通信,Dubbo 效率略高于 Spring
Cloud。
项目搭建
建立父项目
同时删除掉src文件夹
增加pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
建立eureka-provider子项目
增加pom依赖
比如数据库工具等等…
配置文件
application.yaml
server:
port: 8000
配置类
更改类名为需要的类名
我使用的是eurekaApplication
package com.learn.eurekaprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class eurekaApplication {
public static void main(String[] args) {
SpringApplication.run(eurekaApplication.class, args);
}
}
控制器
package com.learn.eurekaprovider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/get")
public String getHello(){
return (new Date()).toString();
}
}
运行启动类看是否成功
运行结果如下
建立eureka-consumer子项目
pom
略
配置文件
server:
port: 8001
启动类
package com.learn.eurekaconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class eurekaApplication {
public static void main(String[] args) {
SpringApplication.run(eurekaApplication.class, args);
}
}
控制器
package com.learn.eurekaconsumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
@RequestMapping("/good")
public class GetController {
@GetMapping("/get")
public String getHello(){
return (new Date()).toString();
}
}
启动测试
使用 RestTemplate 完成远程调用
Spring提供的一种简单便捷的模板类,用于在 java 代码里访问 restful 服务。
其功能与 HttpClient 类似,但是 RestTemplate 实现更优雅,使用更方便。
更改消费者项目中的代码
Controller
package com.learn.eurekaconsumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.Date;
@RestController
@RequestMapping("/good")
public class GetController {
@GetMapping("/get")
public String getHello(){
return (new Date()).toString();
}
@Autowired
private RestTemplate restTemplate;
//远程调用接口
@GetMapping("/getP")
public String getProvider(){
/*
//远程调用Goods服务中的findOne接口
使用RestTemplate
1. 定义Bean restTemplate
2. 注入Bean
3. 调用方法
*/
String url = "http://localhost:8000/hello/get/";
String s = restTemplate.getForObject(url, String.class);
System.out.println(s);
return s;
}
}
启动测试
远程调用成功