什么是微服务
小型的服务,每个服务只提供一个小功能
什么是分布式
把小功能多起几个一样的,就是端口不一样,这就是分布式
为什么要分布式
因为一个服务不能够提供太多人使用,具体查看【无分类/微服务集群】笔记
为什么需要分布式管理
假如我们一个项目有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怎么用的
查看下一个笔记