什么是分布式架构
分布式架构是相对于单体架构而言
- 分布式架构强调小粒度的模块化管理,每个模块独立运行
- 分布式架构强调"避免将鸡蛋放在一个篮子里"
微服务定义
微服务架构风格是一种使用系列微小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,为独立业务开发,并使用轻量级通信协议,一般为HTTP协议,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,保存分布式管理
单体架构的优缺点
优点 | 缺点 |
---|---|
开发简单粗暴 | 开发效率低,团队协作困难 |
服务器开销小 | 部署不够灵活 |
开发简单粗暴 | 稳定性不高,扩展性不好 |
微服务优缺点
优点 | 缺点 |
---|---|
业务驱动 | 人员成本高 |
轻松扩展 | 设备成本高 |
容错机制 | 架构设计要求高 |
管理轻松 | 调试麻烦 |
SpringCloud
- 所有应用的基石被称为注册中心,所有应用都会在注册中心暴露接口地址,被称为"分布式枢纽".
- 服务网关是对于客户端暴露的唯一接口,怎么理解呢,场景如下:在客户管理,人事管理模块,订单模块全部启动之后,都会像注册中心进行注册,并暴露URL地址,服务网关启动之后也会像注册中心进行注册,这个时候PC端带着URL/customer/list地址会先访问到服务网关Gateway,服务网关会将地址传给注册中心.注册中心再将地址转发到对应的服务接口
部署注册中心Eureka
Eureka的两个组件
- Eureka Server 注册中心服务
- Eureka Client 注册中心客户端
@SpringBootApplication
@EnableEurekaServer
public class RegistryApplication {
public static void main(String[] args) {
SpringApplication.run(RegistryApplication.class, args);
}
}
添加@EnableEurekaServer注解启用注册中心
spring:
application:
name: registry
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
添加配置,其中eureka.client.register-with-erreka=fasle 代表不启动自我注册,默认为true
启动工程之后访问localhost:8761,就会出现eureka注册中心客户端了.
微服务注册Eureka
package com.xiaotugou.springcloud.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
加上@EnableDiscoveryClient 在启动时向eureka server注册微服务信息
spring:
application:
name: serve
eureka:
client:
service-url:
defaultZooe: http://127.0.0.1:8761
server:
port: 8081
配置文件指定服务端口,服务名和eureka注册中心服务地址
启动工程之后,再访问localhost:8761注册中心客户端就会看到此时server服务已经成功注册
注:如果注册中心突然关闭,服务会每30秒请求一次注册中心暴露的链接,如果注册中心重新启动,那么服务会重新在eureka注册
如果服务端突然关闭,注册中心也会定时发送心跳包,如果接受不到信息,会自动剔除服务,除非服务重新链接,再进行注册
网关组件Zuul
网关的作用是为客户端提供统一的入口,然后注册中心通过入口找到指定的服务,俗称"路由".
package com.xiaotugou.springcloud.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
添加@EnableZuulProxy注解,启动Zull服务
添加@EnableDiscoveryClient 向eureka注册
spring:
application:
name: zuul
eureka:
client:
service-url:
defaultZooe: http://127.0.0.1:8761/eureka
server:
port: 8082
指定服务名,eureka注册中心地址,端口
注:前面说了,网关的作用是作为服务统一入口进行路由转发,那么,统一入口的格式到底是什么样的呢?
我们做个案例:
我们在server服务里创建一个controller并访问,
package com.xiaotugou.springcloud.server.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: 小土狗
* @Date: 2019/4/3 16:18
* @Version 1.0
*/
@RestController
public class ServerController {
@RequestMapping("/msg")
public String serve (){
return "我是微服务,准备向eureka注册!";
}
}
我们可以看到访问server的接口地址可以正常返回一句话,
那么我们加了网关之后,如何通过网关去向eureka注册进行路由转发呢,标准格式如下:
http://网关域名:网关端口/服务在eureka注册的服务名/requestMapping映射地址
这里是:localhost:8082/serve/msg
如果serve服务是搭了集群的,那么我们通过网关去访问接口是访问的哪台服务器呢?
其实,网关拿到请求地址后,发送给eureka并找到服务之后,若发现该服务是搭了集群的话,会采用轮询的方式去访问,从而避免了单台服务器压力过大导致崩溃,实现负载均衡
Eureka注册中心高可用配置
springcloud的核心是eureka,所有的服务,组件都需要向eureka进行注册,但是如果生产环境中eureka服务挂掉了怎么办?
从上图可以看出来,我们搭两台eureka,并互相注册,保证服务信息同步,
并在服务定义多个eureka注册中心,
spring:
application:
name: serve
eureka:
client:
service-url:
defaultZooe: http://127.0.0.1:8761/eureka, http://127.0.0.1:8762/eureka
server:
port: 8081
上面是serve服务的配置文件,并定义了两个eureka注册中心,默认是按顺序访问注册中心
微服务通信 Feign
定义
- feign是一个声明web服务客户端,出现的唯一目的就是简化微服务的通信过程
- 使用feign开发创建一个接口并使用springmvc注解
- feign内置负载均衡
如何使用
只需要在服务消费方添加@Feign注解,并指向服务提供方即可调用服务提供方在eureka暴露的接口
@Feign(name=“调用服务提供方的服务名”)