微服务开发框架:eureka和nacos介绍

一. 微服务

1.单体架构和分布式架构

  • 单体架构
  • 分布式架构
    根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,成为一个服务
    优点:
    缺点:服务拆分力度、服务集群地址如何维护、服务之间实现远程调用、服务健康状态如何感知
  • 微服务
    • 特点:
      • 单一职责:拆分力度小
      • 面向服务:微服务对外暴露业务接口
      • 自治:团队独立、技术独立、数据独立、部署独立
    • 结构
      • 服务集群
      • 注册中心
      • 配置中心
      • 服务网关
      • 服务监控和保护
    • 框架
      • springcloud
      • Dubbo
        在这里插入图片描述

2.springcloud

  • 1.简介
    • 功能
      • 服务注册发现
      • 服务远程调用
      • 服务链路监控
      • 统一配置管理
      • 统一网关路由
      • 流控、降级、保护
    • springcloud与springboot版本兼容

在这里插入图片描述

二. 服务拆分和远程调用

服务拆分

  • 拆分注意事项
    • 1.不同微服务,不要重复开发相同业务
    • 2.微服务数据独立,不要访问其他微服务的数据库
    • 3.微服务可将自己的业务暴露为接口,供其他微服务调用
  • 拆分demo
    • 1.项目分离
    • 2.数据库分离

远程调用

  • 远程调用
    • 要求:在订单模块查询订单信息,并且要求返回用户信息。
    • 步骤
      • 1)注册RestTemplate
        在这里插入图片描述

      • 2)在OrderService中利用template的api发出http请求
        在这里插入图片描述

注意:
1、当请求时post时,相应的api是postForObject
2、两个application应当都在运行中

  • 提供者和消费者
    • 服务提供者:一次业务中,被其他微服务调用的服务。
    • 服务消费者:一次业务中,调用其他微服务的服务。-

三. Eureka注册中心

eureka注册

  • eureka角色
    • eureka-server注册中心:保存client的地址信息、心跳监控
    • eureka-client客户端:
      • 提供者:注册自己的信息、发送心跳、
      • 消费者:拉取服务列表信息、发出远程调用
  • 作用
    • 提供提供者的信息
      提供者启动时向eureka注册自己的信息
      eureka保存信息
      消费者根据服务名称向eureka拉去提供者信息
    • 消费者从多个提供者选择一个合适的提供者
      采用负载均衡算法,从服务列表选择一个
    • 帮助消费者感知提供者健康状态
      提供者每隔30秒向eureka-server发送心跳请求,报告健康状态
      eureka更新记录服务列表信息,心跳正常不会被剔除
      消费者拉取到最新信息
  • 动手实践
    • 1.搭建注册中心:注册EurekaServer
      在这里插入图片描述

      <dependency>
          <groupId>org.springframework.cloud</groupId>
         <!-- 不要写错依赖呀,否则yml文件无法识别-->
          <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
      
      @EnableEurekaServer
      @SpringBootApplication
      public class EurekaApplication {
      public static void main(String[] args) {
      		SpringApplication.run(EurekaApplication.class,args);
      	}
      }
      
      server:
        port: 10086
      spring:
        application:
      	  name: eurecaserver
      eureka:
        client:
      	register-with-eureka: false   #是否将自己注册到eureka中
      	fetch-registry: false         #是否从eureka中获取信息
        service-url:
      	defaultZone: http://127.0.0.1:10086/eureka/
      
    • 2.注册服务:将User-Service、Order-Service注册到Eureka
      在这里插入图片描述

      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
      
      spring:
        application:
          name: orderservice
       eureka:
      	client:
      	  service-url:
      		defaultZone: http://127.0.0.1:10086/eureka/
      
      
    • 3.服务发现:在order-service中完成服务拉取,然后通过负载均衡挑选一个服务,实现远程调用
      在这里插入图片描述

      @MapperScan("cn.itcast.order.mapper")
      @SpringBootApplication
      public class OrderApplication {
      
      	public static void main(String[] args) {
      		SpringApplication.run(OrderApplication.class, args);
      	 }
      	@Bean
      	@LoadBalanced
      	public RestTemplate restTemplate(){return new RestTemplate();}
      }
      
      @Service
      public class OrderService {
      
          @Autowired
          private OrderMapper orderMapper;
          @Autowired
          private RestTemplate restTemplate;
      
          public Order queryOrderById(Long orderId) {
              // 1.查询订单
              Order order = orderMapper.findById(orderId);
              // 2.利用resttemplate发出http请求,查询用户
              String url = "http://userservice/user/" + order.getUserId();
              User user = restTemplate.getForObject(url, User.class);
              // 3.为order封装user
              order.setUser(user);
              // 4.返回
              return order;
          }
      }
      

Ribbon负载均衡

  • Ribbon负载均衡
    - 原理
    - 规则接口是IRule
    - 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询
    在这里插入图片描述
    在这里插入图片描述

  • 负载均衡策略
    在这里插入图片描述

    • 改变负载均衡策略

      • 1.代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:(作用范围:全体service)

        @Bean
        public IRule randomRule(){   
        	return new RandomRule();
        }
        
      • 2.配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则(只针对某个服务)

      	userservice:
      	  ribbon:
      	    NFLoadBalancerRuleClassName:  com.netflix.loadbalancer.RandomRule# 
      
    • 饥饿加载

      • Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时
      • 配置饥饿加载:
        ribbon:
          eager-load:
            enabled: true # 开启饥饿加载   
            clients: userservice # 指定对userservice这个服务饥饿加载
        
        

四. Nacos注册中心

4.1、认识和安装nacos

  • Nacos:是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高
  • 安装:
    • 默认端口:8848
    • 启动:进入安装路径的bin目录-》执行命令:startup.cmd -m standalone
      在这里插入图片描述
    • 登录:默认账号密码都是nacos
      在这里插入图片描述

4.2、nacos快速入门(注册)

  • nacos注册中心
    在这里插入图片描述
    在这里插入图片描述

  • 注意:首先启动nacos;然后order–service和userservice才的application才能启动成功,否则会报错

            <!--nacos管理依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    
       <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    
    spring:
      cloud:
        nacos:
          server-addr: localhost:8848 #nacos服务端地址
    

4.3、nacos服务分级存储模型和NacosRule负载均衡

  • 分级存储模型
    • 一级是服务,例如userservice
    • 二级是集群,例如杭州或上海
    • 三级是实例,例如杭州机房的某台部署了userservice的服务器
  • 集群
    • 概念:类似于以地名为名的分组
    • 设置实例的集群属性:为userservice配置集群
      修改userservie的application.yml:
      spring:  
        cloud:
          nacos:
            server-addr: localhost:8848 # nacos 服务端地址     
            discovery:
              cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
      
      在nacos控制台查看集群变化:
      在这里插入图片描述
  • NacosRule负载均衡
    • 设置NacosRule负载均衡
      在消费者orderservice的application.yml文件中设置负载均衡的IRule为NacosRule

      userservice:
        ribbon:
        		NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 
      
    • NacosRule优先同集群的负载均衡特性

      • 优先选择同集群的服务实例列表
      • 本地集群找不到提供者,才会跨集群访问并发出警告
      • 确定可用实例列表后,再采用随机负载均衡挑选实例
  • 根据权重负载均衡
    • 实例的权重控制
      1)Nacos控制台可以设置实例的权重值,0~1之间
      2)同集群内的多个实例,权重越高被访问的频率越高
      3)权重设置为0则完全不会被访问
    • 设置实例的权重值:
      在这里插入图片描述
      在这里插入图片描述

4.4、nacos环境隔离

  • 环境隔离 namespace:Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离

    • 特性:
      1)每个namespace都有唯一id
      2)服务设置namespace时要写id而不是名称
      3)不同namespace下的服务互相不可见
      在这里插入图片描述
  • 添加namespace:
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

  • 为order-service服务添加命名空间
    修改order-service的application.yml,添加namespace的id

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/heima?useSSL=false
          username: root
          password: 123
          driver-class-name: com.mysql.jdbc.Driver
          cloud:
            nacos:
              server-addr: localhost:8848
              discovery:
                cluster-name: SH # 上海
                namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
    
    

    然后重启order-service,查看控制台
    在这里插入图片描述

五. Nacos VS Eureka

5.1、区别

在这里插入图片描述

  • Nacos与eureka的共同点
    都支持服务注册和服务拉取
    都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别
    1)Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    2)Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    3)Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

5.2、临时实例和非临时实例

  • 临时实例和非临时实例
    • 服务注册到Nacos时:可以选择注册为临时或非临时实例。默认是临时实例

    • 配置非临时实例
      在服务的application.yml中:

      spring:
        cloud:
      	nacos:
        	  discovery:
          	ephemeral: false # 设置为非临时实例
      
    • 区别:(推荐临时实例)
      1)临时实例采用心跳模式,非临时实例采用主动检测模式
      2)临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值