• SpringCloud入门教程一(微服务原理、Eureka注册中心、Ribbon负载均衡,nacos注册中心)


    一:微服务

    微服务是一种经过良好架构设计的分布式架构方案。
    在这里插入图片描述
    微服务架构特征:
    在这里插入图片描述

    微服务技术对比:
    在这里插入图片描述
    springcloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud

    在这里插入图片描述

    1.服务拆分

    由于采用了分布式架构,所以根据用户id查询用户信息,不能够直接调用service,所以只能采用服务远程调用的方式(访问用户模块根据id查询用户信息的接口)。
    在这里插入图片描述
    在这里插入图片描述
    spring提供了一个工具用户发送http请求:注册RestTemplate

    
    @MapperScan("cn.itcast.order.mapper")
    @SpringBootApplication
    @EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    
        /**
         * 创建RestTemplate并注入Spring容器
         */
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    更改service层

    
    import cn.itcast.feign.clients.UserClient;
    import cn.itcast.feign.pojo.User;
    import cn.itcast.order.mapper.OrderMapper;
    import cn.itcast.order.pojo.Order;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
    
        @Autowired
        private UserClient userClient;
    
    //    public Order queryOrderById(Long orderId) {
    //        // 1.查询订单
    //        Order order = orderMapper.findById(orderId);
    //        // 2.用Feign远程调用
    //        User user = userClient.findById(order.getUserId());
    //        // 3.封装user到Order
    //        order.setUser(user);
    //        // 4.返回
    //        return order;
    //    }
    
        @Autowired
        private RestTemplate restTemplate;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.利用RestTemplate发起http请求,查询用户
            // 2.1.url路径
            String url = "http://userservice/user/" + order.getUserId();
            // 2.2.发送http请求,实现远程调用
            User user = restTemplate.getForObject(url, User.class);
            // 3.封装user到Order
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    服务调用关系:

    • 服务提供者:暴露接口给其他微服务调用
    • 服务消费者:调用其他微服务提供的接口
    • 提供者和消费者的角色是相对的

    二:Eureka注册中心

    项目目录:
    在这里插入图片描述
    项目地址:

    1.Eureka原理分析

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    2.搭建Eureka服务

    在项目中新建一个module,创建maven项目
    引入依赖:Eureka不需要添加版本号,是因为springcloud中有关于Eureka的版本信息

     <!--eureka服务端-->
     
                org.springframework.cloud
                spring-cloud-starter-netflix-eureka-server
            
    
    • 1
    • 2
    • 3
    • 4
    • 5

    新建一个EurekaApplication

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    application.yml文件配置

    server:
      port: 10086 # 服务端口
    spring:
      application:
        name: eurekaserver # eureka的服务名称
    eureka:
      client:
        service-url:  # eureka的地址信息
          defaultZone: http://127.0.0.1:10086/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    启动项目出现下面页面,证明Eureka成功
    在这里插入图片描述
    给其他项目添加Eureka客户端依赖
    在这里插入图片描述

      <!--eureka客户端依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    application.yml添加配置

    eureka:
      client:
        service-url:  # eureka的地址信息
          defaultZone: http://127.0.0.1:10086/eureka
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    注册成功:

    在这里插入图片描述
    服务注册的步骤:

    • 引入Eureka-Client依赖
    • 在application.yml中配置eureka地址

    3.Eureka的服务发现

    在old-service中完成服务拉取
    由于user-service已经完成了Eureka的服务注册,所以可以将localhost:8080替代为userservice

    在这里插入图片描述

    三:Ribbon负载均衡

    1.Ribbon-负载均衡原理

    order-service发起请求由于http://userserivce/user/1不是一个真实的请求,所以这个请求会被拦截,然后交给eureka-service处理。
    在这里插入图片描述
    @LoadBalanced:用于标记RestTemplate被Ribbon拦截和处理
    在这里插入图片描述

    2.Ribbon-负载均衡策略

    代码方式:使用这种方式修改负载均衡规则,作用于全局
    在OrderApplication.java添加

    
        /**
         * 将负载均衡的规则设置为随机
         * @return
         */
        @Bean
        public IRule randomRule() {
            return new RandomRule();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    配置文件方式:先指定服务名称,再添加规则

    userservice:
      ribbon:
        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则
    
    • 1
    • 2
    • 3

    3.Ribbon-懒加载

    Ribbon默认是采用懒加载,及第一次访问时才会去创建LoadBalanceClient,请求时间会很长,而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,开启饥饿加载是在项目启动时
    通过下面配置开启饥饿加载:

    ribbon:
      eager-load:
        enabled: true # 开启饥饿加载
        clients: # 指定饥饿加载的服务名称
          - userservice
    
    • 1
    • 2
    • 3
    • 4
    • 5

    回顾Ribbon
    在这里插入图片描述

    四:Nacos

    1.Nacos认识和安装(windows下安装)

    在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
    GitHub的Release下载页:https://github.com/alibaba/nacos/releases
    在这里插入图片描述

    windows版本使用.zip包即可。
    将这个包解压到任意非中文目录下,如图:
    在这里插入图片描述
    启动:进入bin目录下执行:startup.cmd -m standalone
    验证:访问http://localhost:8848/nacos/出现下面界面代表nacos启动成功
    在这里插入图片描述

    2.Nacos快速入门

    1.在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:

     <!--nacos的管理依赖-->
                
                    com.alibaba.cloud
                    spring-cloud-alibaba-dependencies
                    2.2.5.RELEASE
                    pom
                    import
                
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.注释掉order-service和user-service中原有的eureka依赖。
    3.添加nacos的客户端依赖:

      <!-- nacos客户端依赖包 -->
            
                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-discovery
            
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址:

    spring:
      cloud:
        nacos:
          server-addr: localhost:8848 # nacos服务地址
    
    • 1
    • 2
    • 3
    • 4

    5.验证,启动项目
    访问http://localhost:8848/nacos
    在这里插入图片描述

    3.Nacos服务多级存储模型

    在这里插入图片描述
    在这里插入图片描述
    修改appplication.yml,添加如下内容

    spring:
      application:
        name: userservice
      profiles:
        active: dev # 环境
      cloud:
        nacos:
          server-addr: localhost:8848 # nacos地址
          discovery:
            cluster-name: HZ #集群名称,这里HZ代指杭州
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    在这里插入图片描述

    4.Nacos-Nacos负载均衡

    设置优先访问相同地域集群的规则:在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:

    userservice:
      ribbon:
        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则
    
    • 1
    • 2
    • 3

    当同一集群的服务都被停止时,会访问其他集群的服务,但同时会发出警告
    在这里插入图片描述
    在这里插入图片描述

    4.Nacos-服务实例的权重设置

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    5.Nacos-环境隔离

    在这里插入图片描述
    在这里插入图片描述
    修改order-service的application.yml,添加namespace:
    在这里插入图片描述
    此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错
    在这里插入图片描述
    在这里插入图片描述

    6.Nacos总结(附:临时实列)

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    PCL 半径滤波剔除噪点(二)
    Github创建的个人简历
    解决Pyinstaller打包文件太大的办法(绝对有效,亲测!!!)
    JSP SSH 产品质量追溯管理统myeclipse开发mysql数据库MVC模式java编程网页设计
    Tomcat 开启远程调试
    整形和浮点型是如何在内存中的存储
    在Linux环境下从源码构建并安装GCC
    【嵌入式Linux】5.Ubuntu 交叉编译工具链安装
    【教3妹学编程-算法题】高访问员工
    19. 删除链表的倒数第 N 个结点
  • 原文地址:https://blog.csdn.net/qq_51269815/article/details/126671457