SpringCloud学习(1)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
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系统性能扩展只能通过扩展集群结点成本高、有瓶颈。
3SOA 架构阶段
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、EdgwareFinchleyGreenwichHoxton。
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;
}
}
启动测试
远程调用成功
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |