架构的演进
-
单体应用架构
适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。
缺点:
1、性能扩展比较难
2、协同开发问题
3、不利于升级维护 -
垂直应用架构
通过切分业务来实现各个模块独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能扩展也更方便,更有针对性。
缺点: 公用模块无法重复利用,开发性的浪费 -
分布式应用架构
将各个应用通过分层独立出来,可以利用rpc实现web与service、service与service的互相调用,提高了代码的复用性。
缺点: 每个调用的模块要存储一份完整的被调用模块的位置和状态,一旦位置和状态发生变化,就要更新所有涉及的配置。 -
面向服务的分布式架构
随着架构不断增大,服务节点也越来越多,服务之间的调用和依赖关系也越来越复杂,需要有一个统一的中心来调度、路由、管理所有的服务,基于这个中心构建的这个星型架构就是现在目前最主流的SOA分布式架构。
springcloud
微服务优缺点
微服务技术栈
各微服务框架的比较
完整一套架构
dubbo和springcolud比较
dubbo解决的问题就是(高性能)rpc调用(微服务中的一环),springcloud是微服务的一站式解决方案
Eureka好死不如赖活着
注册中心 Consul 使用详解
https://blog.csdn.net/love_zngy/article/details/82216696
Ribbon负载均衡
# 服务1的配置
server:
port: 19999
spring:
cloud:
consul:
host: localhost #10.33.123.87
port: 8500
discovery:
service-name: privoderDept
# 服务2的配置
#只需将端口19999改成9999
注册中心的情况(对于同一个服务privoderDept,9999机器上有一个,19999机器上也有一个)
客户端调用(客户端调用服务时不需要写具体的ip,写成serviceID就可以,ribbon会使用负载均衡算法自动分配一个服务的一个ip去调用)
@RestController
public class DeptComsumeController {
@Autowired
RestTemplate restTemplate;
//指定服务,未采用负载均衡
//private static final String REST_USL_prefix="http://localhost:9999";
//使用了ribbon,从集群中实现负载均衡,地址使用服务id就可以了
private static final String REST_USL_prefix="http://privoderDept";
@RequestMapping("/comsumer/dept/get/{id}")
public DeptEntity get(@PathVariable("id") Long id){
return restTemplate.getForObject(REST_USL_prefix+"/getDeptById/"+id,DeptEntity.class);
}
}
服务端启动类
@SpringBootApplication
@EnableDiscoveryClient //支持服务发现
@MapperScan("org.lmj.springcloud.mapper")
public class DeptApplication {
public static void main(String[] args) {
SpringApplication.run(DeptApplication.class, args);
}
}
lvs
假设abc三个小区,每个小区带宽100M,a用网主要在早上,b中午,c晚上,不用负载均衡,由于资源有限,abc啥时候都是100M,用了负载,a早上是300M,bc是0M,b中午300M,ac是0M
nginx是服务端负载均衡,ribbon是客户端负载均衡
feign
个人理解:RestTemplate+ribbon 和feign实现功能时一样的,都是远程调用,只是实现方式不同。feign是面向接口,RestTemplate+ribbon是面向服务名
- feign调用
@Component
@FeignClient(value = "privoderDept")
public interface DeptFeignService {
@GetMapping("/getDeptById/{id}")
DeptEntity selectDept(@PathVariable("id") Long deptNo);
}
====================
@RestController
public class DeptComsumeController {
@Autowired
DeptFeignService deptFeignService=null;
@RequestMapping("/comsumerFeign/dept/get/{id}")
public DeptEntity comsumerFeign(@PathVariable("id") Long id){
return this.deptFeignService.selectDept(id);
}
}
- RestTemplate+ribbon调用
@RestController
public class DeptComsumeController {
@Autowired
RestTemplate restTemplate;
private static final String REST_USL_prefix="http://privoderDept";
@RequestMapping("/comsumer/dept/get/{id}")
public DeptEntity get(@PathVariable("id") Long id){
return restTemplate.getForObject(REST_USL_prefix+"/getDeptById/"+id,DeptEntity.class);
}
}
- 二者所调用的服务(都是实现了负载均衡)