zoukankan      html  css  js  c++  java
  • 分布式管理

    什么是微服务
    小型的服务,每个服务只提供一个小功能

    什么是分布式
    把小功能多起几个一样的,就是端口不一样,这就是分布式

    为什么要分布式
    因为一个服务不能够提供太多人使用,具体查看【无分类/微服务集群】笔记

    为什么需要分布式管理
    假如我们一个项目有4个订单服务,端口是1001,1002,1003,1004;2个用户服务,端口是2001,2002;用户通过用户服务访问订单服务,不能说2001就永远请求1001是吧,需要4个随机访问,这里用nginx的负载均衡配置就可以实现,但是一旦服务增加或者停用,不停的修改配置就非常的不靠谱,并且还要把服务链接写死,哪天要改BUG少不了,就需要一个专门的管理者,负责调用多个微服务之间的关系,每个微服务都像是一个电器,而管理者就像是一个排插

    RPC服务框架

    • 分布式的管理优秀的点就在于RPC的通信模式
    • server层已经独立为微服务,controller层去调用server层却不是通过调用接口的写法
    • 而是保持原本的MVC写法几乎不需要改动,由框架去通知管理员找原server层分离出去的微服务拿数据,虽然实际确实还是通过接口去调用

    一次完整的RPC调用流程
    1)服务消费方(client)调用以本地调用方式调用服务;
    2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
    3)client stub找到服务地址,并将消息发送到服务端;
    4)server stub收到消息后进行解码;
    5)server stub根据解码结果调用本地的服务;
    6)本地服务执行并将结果返回给server stub;
    7)server stub将返回结果打包成消息并发送至消费方;
    8)client stub接收到消息,并进行解码;
    9)服务消费方得到最终结果。

    CAP原则
    不能同时满足【C强一致性,A可用性,P分区容错性】,最多同时满足其中两个,这是是分布式和集群的缺点,详细可以查看【无分类/微服务集群】笔记

    排插
    排插现在有两个主流【zookeeper,SpringCloud】,目前的插头和排插有两种做法

    • SpringBoot/SSM + Dubbo + zookeeper【CP】
    • SpringBoot + SpringCloud【AP】

    在SpringBoot里就说过他跟普通的SSM的区别就是他可以用来连接SpringCloud,他自带一个插头,SSM就没有插头,所以他不能链接SpringCloud或者得加装Dubbo然后连接zookeeper

    Dubbo + zookeeper
    我们主要学习的是SpringCloud,这里就简单理解下怎么用的

    • 在服务器安装zookeeper,然后直接启动就行,springcloud自带有可视化管理界面,zookeeper没有,但是他有非自带的工具,自行百度
    • 服务提供者,添加maven依赖
    <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>dubbo</artifactId>
         <version>2.6.0</version>
    </dependency>
    <dependency>
         <groupId>org.apache.zookeeper</groupId>
         <artifactId>zookeeper</artifactId>
         <version>3.4.7</version>
    </dependency>
    <dependency>
         <groupId>com.github.sgroschupf</groupId>
         <artifactId>zkclient</artifactId>
         <version>0.1</version>
    </dependency>
    
    • 服务提供者,添加配置,扫描暴露service
    <!--为服务消费者在向注册中心订阅服务时起个名字-->
    <dubbo:application name="dubbodemo_consumer"/>
    <!--连接到zookeeper注册中心-->
    <dubbo:registry address="zookeeper://127.0.0.1" port="2181"/>
    <!--开启包扫描,使dubbo的注解生效,让当前的被注解的类交给dubbo管理-->
    <dubbo:annotation package="com.web.service"/>
    
    • 服务提供者,需要把spring的@service改成dubbo的,服务提供者没有controller层
    import com.alibaba.dubbo.config.annotation.Service;
    import com.alibaba.service.provider.HelloService;
    
    //此注解使用的阿里巴巴的dubbo注解
    @Service
    public class HelloServiceImpl implements HelloService {
        @Override
        public String sayHello(String name) {
            return "hello@@"+name;
        }
    }
    
    • 消费者,连接上跟服务提供者一样的zk后就能使用他们的service方法了
    @Controller
    public class HelloController {
        //此处使用阿里巴巴的注解进行注入
        @Reference
        HelloService helloService;
    
        @RequestMapping("/hello")
        public void hello(String name) {
            // 这里会去请求云服务器的zookeeper,然后得到结果
            String result = helloService.sayHello(name);
            System.out.println(result);
        }
    }
    
    • 服务提供者也可以调用另一个服务提供者,写法一样

    负载均衡

    对于这个路径一样,文件一样的要求还是很麻烦的,还是spring家族真香

    springcloud怎么用的
    查看下一个笔记

  • 相关阅读:
    用户与组
    初识linux
    权限管理
    认识vim 编辑器
    文件归档
    路由相关术语
    Access、Hybrid和Trunk
    #error作用
    交换芯片收发包的 DMA 实现原理
    linux网络学习
  • 原文地址:https://www.cnblogs.com/pengdt/p/13523347.html
Copyright © 2011-2022 走看看