Spring-Cloud-Netflix-系统架构

系统架构

概述

随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。 系统架构也所以也不断的演进、升级、迭代。
从单一应用,到垂直拆分,到分布式服务,到SOA,以及如今火热的微服务架构html

集中式架构

概述

当网站流量很小时,只需一个应用 将全部功能都部署在一块儿,以减小部署节点和成本 从头至尾就一个工程,部署的时候 , 只须要打成一个war包java

特色

  1. 代码耦合,开发维护困难
  2. 没法针对不一样模块进行针对性优化
  3. 没法水平扩展
  4. 单点容错率低,并发能力差

垂直拆分

概述

当访问量逐渐增大,单一应用没法知足需求,此时为了应对更高的并发和业务需求,咱们根据业务功能对系统进行拆分nginx

特色

  1. 系统拆分实现了流量分担,解决了并发问题
  2. 能够针对不一样模块进行优化
  3. 方便水平扩展,负载均衡,容错率提升
  4. 系统间相互独立,会有不少重复开发工做,影响开发效率

系统架构分类

微服务

微服务就是把本来臃肿的一个项目的全部模块拆分开来并作到互相没有关联,甚至能够不使用同一个数据库web

微服务的特色:

  1. 单一职责微服务中每个服务都对应惟一的业务能力,作到单一职责
  2. 服务拆分粒度很小例如一个用户管理就能够做为一个服务
  3. 面向服务面向服务是说每一个服务都要对外暴露服务接口API,并不关心服务的技术实现,作到与平台和语言无关,不限定用什么技术实现,只要提供Rest的接口便可
  4. 自治自治是说服务间互相独立,互不干扰

分布式服务:

概述:spring

当垂直应用愈来愈多,应用之间交互不可避免,将核心业务抽取出来,做为独立的服务
分布式,就是将偌大的系统划分为多个模块(这一点和微服务很像)部署到不一样机器上 由于一台机器可能承受不了这么大的压力
各个模块经过接口进行数据交互,其实 分布式也是一种微服务。数据库

特色:浏览器

  1. 将基础服务进行了抽取,系统间相互调用,提升了代码复用和开发效率
  2. 系统间耦合度变高,调用关系错综复杂,难以维护

微服务和分布式的区别:

微服务与分布式都是把模块拆分开来变为独立的单元,提供接口来调用springboot

他们本质的区别在于目标的不一样:服务器

  1. 分布式的目标是:一台机器承受不了的,或者是成本问题 , 不得不使用多台机器来完成服务的部署
  2. 微服务的目标 :只是让各个模块拆分开来,不会被互相影响,好比模块的升级亦或是出现BUG等等...

微服务要面临的问题:

  1. 服务治理(SOA)
    概述:

当服务愈来愈多,容量的评估,小服务资源的浪费等问题逐渐显现, 此时需增长一个调度中心基于访问压力实时管理集群容量,提升集群利用率。
(SOA)用于提升机器利用率的资源调度和治理中心网络

问题:

服务愈来愈多,须要管理每一个服务的地址 调用关系错综复杂,难以理清依赖关系 服务过多,服务状态难以管理,没法根据服务状况动态管理

服务治理要作什么:

服务注册中心,实现服务自动注册和发现,无需人为记录服务地址 服务自动订阅,服务列表自动推送,服务调用透明化,无需关心依赖关系
动态监控服务状态监控报告,人为控制服务状态

  1. 监听服务有没有宕机:部署不少服务后 ,若是监听到服务有没有宕机
  2. 负载均衡:一个服务吃不消,要部署多个服务,部署的多个服务均衡调用
  3. 熔断:服务出现了问题,不能让程序卡在那里
  4. 限流:限流就是针对超过预期的流量,经过预先设定的限流规则选择性的对某些请求进行限流“熔断”
  5. 降级:当服务器压力剧增的状况下,根据实际业务状况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运做或高效运做
  6. 网关:统一管理API的一个网络关口、通道,是整个微服务平台全部请求的惟一入口

springClould是什么

微服务只是一种项目的架构方式,或者说是一种概念
Spring-Cloud即是对这种技术的实现
对微服务面临的问题进行统一的封装处理

远程调用方式:

RPC:

  1. Remote Produce Call远程过程调用,相似的还有RMI。自定义数据格式,基于原生TCP通讯,速度快,效率高
  2. 早期的webservice,如今热门的dubbo,都是RPC的典型
  3. 限制了平台,只能是Java平台

Http:

  1. http实际上是一种网络传输协议,基于TCP,规定了数据传输的格式
  2. 如今客户端浏览器与服务端通讯基本都是采用Http协议。也能够用来进行远程服务调用。缺点是消息封装臃肿
  3. 不限制平台

模拟微服务:

  1. 建立一个普通父工程,删除src目录,保留pom文件
    在这里插入图片描述
    在这里插入图片描述
  2. 在父工程当中添加springboot依赖
    在这里插入图片描述
    代码:
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.3.RELEASE</version>
    </parent>
  1. 建立子模块user
    在这里插入图片描述
    在这里插入图片描述
  2. 添加springboot-web启动器依赖
    在这里插入图片描述
    代码:
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  1. 建立user工程启动类UserApplication
    在这里插入图片描述
    代码:
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class,args);
    }
}
  1. 建立util包,把ResponseResult工具类复制到该包中
    在这里插入图片描述
    代码:
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);
    }

}
  1. 建立子包controller,在controller当中建立UserController
    在这里插入图片描述
    代码:
@RestController
public class UserController {
    @RequestMapping("/getUser.do")
    public ResponseResult getUser() {
        return ResponseResult.success("返回成功","myUser");
    }
}
  1. 在resources目录下建立application.yml
    在这里插入图片描述
  2. 启动访问http://localhost:5000/getUser.do
    10.
  3. 建立子模块goods
    在这里插入图片描述
  4. 配置和user同样,修改server-port端口为:5001
    在这里插入图片描述
    在这里插入图片描述
  5. 启动访问http://localhost:5001/getGoods.do
    在这里插入图片描述
  6. user工程调用goods工程当中的接口
    在UserApplication中添加RestTemplate的Bean
    在这里插入图片描述
    代码:
@Bean
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }

在user工程的UserController当中注入restTemplate
在这里插入图片描述
经过restTemplate实现工程之间的接口调用
在这里插入图片描述
同时运行两个工程, 访问http://localhost:5000/getGoods.do
在这里插入图片描述
以上操做就实现了两个工程之间的调用

使用nginx实现集群搭建

  1. 下载nginx 网址:nginx下载地址
    在这里插入图片描述
    下载后解压:注意解压目录不要带有中文
  2. 建立一个新的goods1工程 和goods如出一辙 只须要改端口号便可,用于搭建集群。
    在这里插入图片描述
  3. 修改nginx的配置文件
    在这里插入图片描述
    把以前的server的代码删掉,替换成这样
    在这里插入图片描述
    代码:
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;
        }
  1. 配置完成后启动nginx.exe
    在这里插入图片描述
    启动会一闪而过 属于正常状况

  2. 把user中调用方的端口号改成80
    在这里插入图片描述

  3. 启动user,goods,goods1 访问user的地址:http://localhost:5000/getGoods.do
    在这里插入图片描述
    在这里插入图片描述
    会发现每次刷新访问,都会返回两个不一样的工程的controller,完成集群的搭建。

存在问题, 若是其中的一个服务中止了, 当访问的时候 , 会出现有时会很慢的状况
解决方案:用到SpringCloud的Eureka注册中心来管理咱们的服务
在这里插入图片描述 下次更新 Spring-Cloud-Netflix-Eureka的使用方法

相关文章
相关标签/搜索