随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。 系统架构也所以也不断的演进、升级、迭代。
从单一应用,到垂直拆分,到分布式服务,到SOA,以及如今火热的微服务架构html
当网站流量很小时,只需一个应用 将全部功能都部署在一块儿,以减小部署节点和成本 从头至尾就一个工程,部署的时候 , 只须要打成一个war包java
当访问量逐渐增大,单一应用没法知足需求,此时为了应对更高的并发和业务需求,咱们根据业务功能对系统进行拆分nginx
微服务就是把本来臃肿的一个项目的全部模块拆分开来并作到互相没有关联,甚至能够不使用同一个数据库web
概述:spring
当垂直应用愈来愈多,应用之间交互不可避免,将核心业务抽取出来,做为独立的服务
分布式,就是将偌大的系统划分为多个模块(这一点和微服务很像)部署到不一样机器上 由于一台机器可能承受不了这么大的压力
各个模块经过接口进行数据交互,其实 分布式也是一种微服务。数据库
特色:浏览器
微服务与分布式都是把模块拆分开来变为独立的单元,提供接口来调用springboot
他们本质的区别在于目标的不一样:服务器
当服务愈来愈多,容量的评估,小服务资源的浪费等问题逐渐显现, 此时需增长一个调度中心基于访问压力实时管理集群容量,提升集群利用率。
(SOA)用于提升机器利用率的资源调度和治理中心网络
问题:
服务愈来愈多,须要管理每一个服务的地址 调用关系错综复杂,难以理清依赖关系 服务过多,服务状态难以管理,没法根据服务状况动态管理
服务治理要作什么:
服务注册中心,实现服务自动注册和发现,无需人为记录服务地址 服务自动订阅,服务列表自动推送,服务调用透明化,无需关心依赖关系
动态监控服务状态监控报告,人为控制服务状态
微服务只是一种项目的架构方式,或者说是一种概念
Spring-Cloud即是对这种技术的实现
对微服务面临的问题进行统一的封装处理
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.3.RELEASE</version> </parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
@SpringBootApplication public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class,args); } }
public class ResponseResult extends HashMap { public static String SUCCESS_CODE = "200"; public static String ERROR_CODE = "500"; public static String DATA_KEY = "data"; public static String MSG_KEY = "msg"; private ResponseResult() { } public ResponseResult set(String key, Object object) { super.put(key, object); return this; } private static ResponseResult newResponseResult() { return new ResponseResult(); } public static ResponseResult success() { return ResponseResult.newResponseResult() .set("code", ResponseResult.SUCCESS_CODE) .set(ResponseResult.MSG_KEY, "操做成功"); } public static ResponseResult success(String msg) { return ResponseResult.newResponseResult() .set("code", ResponseResult.SUCCESS_CODE) .set(ResponseResult.MSG_KEY, msg); } public static ResponseResult success(String msg, Object object) { return ResponseResult.newResponseResult() .set("code", ResponseResult.SUCCESS_CODE) .set(ResponseResult.MSG_KEY, msg) .set(ResponseResult.DATA_KEY, object); } public ResponseResult data(Object obj) { return this.set("data", obj); } public static ResponseResult error() { return ResponseResult.newResponseResult() .set(ResponseResult.MSG_KEY, "操做失败") .set("code", ResponseResult.ERROR_CODE); } public static ResponseResult error(String msg) { return ResponseResult.newResponseResult() .set(ResponseResult.MSG_KEY, msg) .set("code", ResponseResult.ERROR_CODE); } public static ResponseResult error(String msg, Object object) { return ResponseResult.newResponseResult() .set(ResponseResult.MSG_KEY, msg) .set(ResponseResult.DATA_KEY, object) .set("code", ResponseResult.ERROR_CODE); } }
@RestController public class UserController { @RequestMapping("/getUser.do") public ResponseResult getUser() { return ResponseResult.success("返回成功","myUser"); } }
@Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
在user工程的UserController当中注入restTemplate
经过restTemplate实现工程之间的接口调用
同时运行两个工程, 访问http://localhost:5000/getGoods.do
以上操做就实现了两个工程之间的调用
upstream mServer { server localhost:5001; server localhost:5002; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_pass http://mServer; }
配置完成后启动nginx.exe
启动会一闪而过 属于正常状况
把user中调用方的端口号改成80
启动user,goods,goods1 访问user的地址:http://localhost:5000/getGoods.do
会发现每次刷新访问,都会返回两个不一样的工程的controller,完成集群的搭建。
存在问题, 若是其中的一个服务中止了, 当访问的时候 , 会出现有时会很慢的状况
解决方案:用到SpringCloud的Eureka注册中心来管理咱们的服务
下次更新 Spring-Cloud-Netflix-Eureka的使用方法