系统架构演变和远程调用

系统架构演变和远程调用

​ 随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此也不断的演进、升级、迭代。从单一应用 一> 垂直拆分应用 一> 分布式服务 一> SOA 一> 微服务架构,还有在Google带领下来势汹涌的Service Mesh。

​ 我们到底是该乘坐微服务的帆船驶向远方,还是偏安一隅,得过且过? 把握现在,学习现在最火的技术架构;展望未来,争取成为一名优秀的Java工程师。

1.1 单一应用架构


​ 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
在这里插入图片描述
问题:

  • 代码耦合度高,开发维护困难
  • 无法针对不同模块进行针对性优化
  • 无法水平扩展
  • 容错性差,并发能力差

1.2 垂直应用架构


​ 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。

在这里插入图片描述
优点:

  • 系统拆分实现了流量分担,解决了并发问题

  • 可以针对不同模块进行优化

  • 方便水平扩展,负载均衡,容错性提高

缺点:

  • 系统间相互独立,会有很多重复开发工作,影响开发效率(例如:都需要用到用户认证服务)

1.3 分布式服务架构


​ 当垂直拆分的应用越来越多,可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心。

在这里插入图片描述
优点:

  • 将基础服务进行了抽取,系统间相互调用,提高了代码复用和开发效率

问题:

  • 服务越来越多,需要管理每个服务的地址(例如,A需要调用B、C、D、E四个服务,便需要配置四个服务的地址)

  • 调用关系错综复杂,难以理清依赖关系(上图可见)

  • 服务过多,服务状态难以管理,无法根据服务情况动态管理(例如,A需要调用B,B采用集群,集群有三个服务B1, B2, B3,到底调用哪个服务?怎么负载均衡?如果B1宕机了A怎么知道?)

1.4 面向服务架构(SOA)


​ 当服务越来越多,需增加一个调度中心来实现服务治理。

在这里插入图片描述
服务治理要做什么?

  • 服务注册中心,实现服务自动注册和发现,无需人为记录服务地址
  • 服务监控,使得服务调用透明化
  • 服务状态监控等

问题:

  • 一般而言,SOA架构只专注于服务治理,但是若项目拆分成多个微服务,只做服务治理还远远不够。

1.5 微服务架构


微服务架构是一种使用一套小服务来开发单个应用的方式或途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是RESTFUL API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务可使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。

微服务的特点:

  • 单一职责:微服务中每一个服务都对应唯一的业务能力,做到单一职责
  • 微:微服务的服务拆分粒度很小,例如一个用户管理或部门管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。
  • 面向服务:面向服务是说每个服务都要对外暴露Restful(参数是xml或json格式的http接口)风格服务接口API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供Restful的接口即可。
  • 自治:自治是说服务间互相独立,互不干扰
    • 团队独立:每个服务都是一个独立的开发团队,人数不能过多。
    • 技术独立:因为是面向服务,提供Restful接口,使用什么技术没有别人干涉
    • 数据库分离:每个服务都使用自己的数据源
    • 部署独立,服务间虽然有调用,但要做到服务重启不影响其它服务。有利于持续集成和持续交付。每个服务都是独立的组件,可复用,可替换,降低耦合,易维护

微服务架构图:
在这里插入图片描述

02、远程调用方式介绍

目标:了解几种远程调用方式

2.1 RPC&HTTP


无论是微服务还是SOA,都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢?

常见的远程调用方式有以下2种:

  • RPC:Remote Produce Call远程过程调用,RPC基于Socket(套接字),工作在会话层,可自定义数据格式,早期的webservice,现在热门的dubbo,都是RPC的典型代表 。(物理层、数据链路层(帧)、网络层(ip)、传输层(tcp、udp)、会话层(session)、表示层(编码解码)、应用层(http))
    • 缺点:服务的提供方和调用方必须采用同一种开发语言
    • 优点:速度快,效率高。
  • Http:http其实是一种网络传输协议,基于TCP,工作在应用层,规定了数据传输的格式(例如请求头,响应头)。现在浏览器客户端与服务端通信基本都是采用Http协议,也可以用来进行远程服务调用。Rest风格请求就是使用http实现。
    • 缺点:1、消息封装臃肿;2、速度相对于RPC慢一点
    • 优势:对服务的提供方和调用方没有任何技术限定,自由灵活,更符合微服务理念。

2.2 Http客户端工具


既然微服务选择了Http,那么我们就需要考虑自己来实现对请求和响应的处理。不过开源世界已经有很多的http客户端工具,能够帮助我们做这些事情,例如:

  • URLConnection (JDK原生)

说明:不同的客户端,API各不相同

2.3 Spring的RestTemplate


spring-web模块提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与json的序列化和反序列化,非常方便。RestTemplate并没有限定Http的客户端类型,而是进行了抽象,目前常用的3种都有支持:

  • HttpClient
  • OkHttp
  • URLConnection

说明:URLConnection为JDK原生,也是RestTemplate默认的选择。

03、RestTemplate远程调用

目标:学会使用RestTemplate实现远程调用

3.1 实现步骤

  • 第一步:搭建项目(http-demo)
    在这里插入图片描述

  • 第二步:编写pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
             http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.6.RELEASE</version>
        </parent>
        <groupId>cn.itcast</groupId>
        <artifactId>http-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <!-- web启动器 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- test启动器 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
    
  • 第三步:编写启动类:cn.itcast.DemoApplication.java

    @SpringBootApplication
    public class DemoApplication {
        public static void main(String[] args){
            SpringApplication.run(DemoApplication.class, args);
        }
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    
  • 第四步:编写测试类:cn.itcast.RestTemplateTest.java

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class RestTemplateTest {
        @Autowired
        private RestTemplate restTemplate;
        /** 发送get请求 */
        @Test
        public void testSendGet() {
            String content = restTemplate.getForObject("https://www.jd.com",
                    String.class);
            System.out.println("content = " + content);
        }
        /** 发送post请求 */
        @Test
        public void testSendPost() {
            String content = restTemplate.postForObject("https://www.jd.com",
                    HttpEntity.EMPTY, String.class);
            System.out.println("content = " + content);
        }
    }
    

3.2 小结

get请求:restTemplate.getForObject(“请求url”, “响应数据类型”);

post请求:restTemplate.postForObject(“请求url”,“请求头|请求体”,“响应数据类型”);

说明:如果响应数据为json字符串,响应数据类型可以直接用实体类接收,已经帮我们进行了反序列化

Memorial Day is 512 days
I miss you
xiaokeai

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值