SpringCloud01

SpringCloud01

微服务入门案例

实现步骤

    1. 导入数据
    1. 实现远程调用
    @MapperScan("cn.itcast.order.mapper")
    @SpringBootApplication
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    
        /**
         * 将redisTemplate加入spring容器当中
         * @return
         */
        @Bean
        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. 查询用户信息
            //2.1 url路径
            String url = "http://localhost:8081/user/"+order.getUserId();
            //2.2 发送http请求,实现远程调用
            User user = restTemplate.getForObject(url, User.class);
            //3.封装order数据
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    
    @Slf4j
    @RestController
    @RequestMapping("/user")
    public class UserController{
    
        @Autowired
        private UserService userService;
        
        /**
         * 路径: /user/110
         *
         * @param id 用户id
         * @return 用户
         */
        @GetMapping("/{id}")
        public User queryById(@PathVariable("id") Long id) {
            return userService.queryById(id);
        }
    }
    

Eureka注册中心

结构

请添加图片描述

入门案例

  • 实现步骤

      1. 创建eureka服务,引入依赖
      <dependency>
      <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
      
    1. 编写启动类

      @SpringBootApplication
      @EnableEurekaServer
      public class EurekaApplication {
          public static void main(String[] args) {
              SpringApplication.run(EurekaApplication.class, args);
          }
      }
      
      1. 编写配置文件
      server:
        port: 10086 # 服务端口
      
      # 以下配置为注册服务
      spring:
        application: # 微服务名称
          name: eureka-server
      
      eureka:
        client:
          register-with-eureka: true # 是否注册自己
          fetch-registry: true #是否拉取服务,获取Eureka中的注册表信息,也就是我们注册到注册中心的服务
          service-url: # eureka的地址信息,eureka本身也是一个微服务,会将自身注册到eureka上
            defaultZone: http://127.0.0.1:10086/eureka
      
      1. 服务注册
        1. 引入依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        
        1. 编写配置
        spring:
          application:
            name: userservice
        eureka:
          client:
            service-url:
              defaultZone: http://127.0.0.1:10086/eureka
        
      1. 服务发现
        1. 引入依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        
        1. 编写配置
        spring:
          application:
            name: orderservice
        eureka:
          client:
            service-url:
              defaultZone: http://127.0.0.1:10086/eureka
        
        1. 服务拉取与负载均衡

        添加@LoadBalanced注解

        @MapperScan("cn.itcast.order.mapper")
        @SpringBootApplication
        public class OrderApplication {
        
            public static void main(String[] args) {
                SpringApplication.run(OrderApplication.class, args);
            }
        
            /**
             * 将redisTemplate加入spring容器当中
             * @return
             */
            @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. 查询用户信息
                //2.1 url路径
                //String url = "http://localhost:8081/user/"+order.getUserId();
                //使用服务名代替ip和端口
                String url = "http://userservice/user/"+order.getUserId();
                //2.2 发送http请求,实现远程调用
                User user = restTemplate.getForObject(url, User.class);
                //3.封装order数据
                order.setUser(user);
                // 4.返回
                return order;
            }
        }
        

Ribbon负载均衡

原理

请添加图片描述

流程

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

饥饿加载

  • Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

# 开启饥饿加载,降低第一次访问时间
# 默认使用的时懒加载,即第一次访问时才创建loadBalanceClient
# clients为集合,若存在多个服务,需要使用如下方式配置
ribbon:
  eager-load:
    clients:
      - userservice # 指定饥饿加载的服务名称
#        - xxxxservice
    enabled: true # 开启饥饿加载

Nacos注册中心

服务注册到nacos

  • 实现步骤

      1. 引入依赖

      父工程引入SpringCloudAlibaba的依赖

      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-alibaba-dependencies</artifactId>
          <version>2.2.6.RELEASE</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
      

      服务模块引入nacos依赖

      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
      
      1. 配置nacos地址
      spring:
        cloud:
          nacos:
            server-addr: localhost:8848
      

nacos服务分级存储模型

  • 介绍
    请添加图片描述

  • 集群配置

修改order-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称
  • 同集群优先配置

修改order-service的application.yml文件,修改负载均衡规则:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 
  • 权重配置

请添加图片描述

  • 环境隔离

    • 实现步骤

        1. 创建namespace

请添加图片描述

- 2. 编写配置文件

  ```yml
  spring:
    cloud:
      nacos:
        server-addr: localhost:8848
        discovery:
          cluster-name: HZ
          namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
  ```

eureka与nacos的区别

nacos服务实例分类

  • 临时实例

如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。

  • 非临时实例

如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

配置一个服务实例为永久实例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

共同点

  • 都支持服务注册和服务拉取
  • 都支持服务提供者心跳方式做健康检测

区别

请添加图片描述

  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值