SpringCloud基础学习:浅谈SpringCloud

什么是微服务?

我们都知道SpringCloud是专门用于开发微服务的,那么我们要首先了解微服务是什么。

微服务(Microservice):是一种架构模式,提倡将单体应用划分成一组小的服务,每个服务都运行在独立的进程中,服务之间相互协调和配置。如:淘宝,京东,抖音......面向大量的互联网用户随之带来的问题:高并发,高可用,高性能;

单体架构:属于单体应用,一般是企业内部使用。

对比单体应用架构和微服务架构

单体应用架构:一个项目打包部署到一台服务器

缺点:

代码复杂性高;技术更新难;

迭代频率底;扩展性低,只能垂直扩展(提升硬件);

可靠性低,一个bug会导致整个项目崩溃;

性能底,项目包太大,请求和响应时间长;

微服务架构:多个小项目打包成多个包部署到多台服务器

 

 优势:

单个项目复杂性底,容易更新;

版本迭代频率高,扩展性提升,可水平扩展(多加几台服务器);

可靠性,一个服务出bug其他的能继续访问;

性能提升,项目小了,反应快

缺点:

成本更高,多台服务器
整体项目的复杂性大大提升
 运维更难

SpringCloud

开发微服务的架构,最早我们使用zookeeper+dubbo来搭建,很多需要自己搭建;而SpringCloud功能比较全面,使开发更容易;

 

主要的组件

注册中心,服务的注册和发现机制,Eureka、Nacos、Zookeeper等;

配置中心,集中管理服务的配置文件,Config、Nacos;

API网关,实现路由和权限管理,Zuul、Gateway;

服务通信,实现Restful的服务调用,Openfeign、Dubbo;

负载均衡,平衡每个服务的负载量,Ribbon;

熔断器,提高系统的可靠性,Hystrix、Sentinel分布式事务,全局事务管理多个服务,Seata

搭建SpringCloud

SpringCloud是基于springboot的;他们的版本兼容性

 主要框架有Neflix和Alibaba

Neflix(俗称 网飞):Eureka,Ribbon,Hystrix,Zuul

Alibaba:Nacos,Sentinel,Seate,RocketMQ

注册中心

他解决了什么问题?

1、首先创建一个父项目和商品、订单两个子项目

 2、编写商品访问接口

/**
 * 商品
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {

    private Long id;
    private String name;
    private Double price;
}

@RestController
public class ProductController {

    @GetMapping("/product/{id}")
    public ResponseEntity<Product> findProductById(@PathVariable("id")Long id){
        //返回模拟数据
        Product product = new Product(id,"测试商品",99.98);
        return ResponseEntity.ok(product);
    }
}

3、订单服务通过商品服务获得商品

/**
 * 订单
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {

    private Long id;
    private Long count;
    private Product product;
}

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

@RestController
public class OrderController {

    //通过Restful访问其它服务的模板对象
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/order/{id}")
    public ResponseEntity<Order> findOrderById(@PathVariable("id")Long id){
        //模拟订单数据
        Order order = new Order(id,99L,null);
        //调用商品服务获得商品
        ResponseEntity<Product> entity = restTemplate.getForEntity("http://127.0.0.1:8001/product/8", Product.class);
        order.setProduct(entity.getBody());
        return ResponseEntity.ok(order);
    }
}

多个微服务之间相互通信,需要通过IP和端口

 

随之而来的问题是

这样写端口和ip固定不可变了,无法实现集群部署,一旦IP或者端口改变,调用就会出错。

Eureka注册中心

服务的提供者和服务的消费者都在注册中心上注册将IP和端口保存在上面,服务消费者调用服务提供者时通过注册中心的服务清单查找,进行通信

 1.提供者将IP和端口猪儿侧导注册中心

2.注册中心和提供者每隔60s发送心跳包

3.如果90s没有收到心跳,注册中心就会将服务剔除

4.消费者调用提供者时,会在注册中心上的服务清单查找

5.消费者通过服务清单上的ip和端口来调用提供者

6.服务清单每30s更新一次

搭建Eureka服务器

1.引入依赖spring-cloud-starter-netflix-eureka-server

2.在启动类上加上注解@EnableEurekaServer

3.编写配置文件

server.port=8888
spring.application.name=eureka-server
eureka.instance.hostname=127.0.0.1
# 是否注册到Eureka上,false 本身就是服务器
eureka.client.register-with-eureka=false
# 是否拉取服务清单,false
eureka.client.fetch-registry=false
# 服务的地址配置
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

配置客户端

1.导入依赖spring-cloud-starter-netflix-eureka-client

2.启动类上加@EnableEurekaClient

3.配置文件

server.port=8002
# 服务名称
spring.application.name=order-service
# 是否注册到Eureka上
eureka.client.register-with-eureka=true
# 是否拉取服务清单,false
eureka.client.fetch-registry=true
# 服务的地址配置
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8888/eureka/

Eureka的集群配置

提高注册中心的可用性,一个挂了其它的可以用

增加Eureka服务器,让它们相互注册,所有客户端注册到所有注册中心上

这里我们搭建一个伪集群

application-server1.properties

server.port=8888
spring.application.name=eureka-server
eureka.instance.hostname=127.0.0.1
# 是否注册到Eureka上,true 服务器注册到其它Eureka上
eureka.client.register-with-eureka=true
# 是否拉取服务清单,true
eureka.client.fetch-registry=true
# 服务的地址配置
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:7777/eureka/
# 自我保护机制 false关闭
eureka.server.enable-self-preservation=false

application-server2.properties

server.port=7777
spring.application.name=eureka-server
eureka.instance.hostname=127.0.0.1
# 是否注册到Eureka上
eureka.client.register-with-eureka=true
# 是否拉取服务清单
eureka.client.fetch-registry=true
# 服务的地址配置
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8888/eureka/
# 自我保护机制 false关闭
eureka.server.enable-self-preservation=false

 配置两个启动配置

 客户端注册

将客户端配置文件修改:

eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8888/eureka/,http://127.0.0.1:7777/eureka/

实现一个伪集群小demo

可以看见我们的服务器和另一台相互注册,product和order也都在清单上

使用swagger测试

结果正确,我们的小demo算是成功了

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值