• Eureka注册中心


    基于RestTemplate发起的http请求实现远程调用

    @SpringBootApplication
    public class OrderApplication {
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @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请求,实现远程调用
            //   将响应的结果反序列化为User对象
            String url = "http://localhost:8081/user/" + order.getUserId();
            User user = restTemplate.getForObject(url, User.class);
            // 3.填充
            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

    Eureka注册中心

    每一个服务启动的时候都会在Eureka注册中心进行注册信息。
    Consumer调用Provider的时候,会在注册中心拉取,Provider的注册信息。
    每一个服务每隔30s都会向Eureka发一次心跳请求,报告健康状态,如果不跳了,Eureka就会删除其注册信息。

    搭建Eureka注册中心

    新建一个maven模块,添加依赖

            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
                
                <version>3.0.3version>	
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    启动类

    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    配置文件

    server:
      port: 10086
    
    spring:
      application:      # 服务名称
        name: eureka_server
    
    eureka:
      client:
        service-url:  # eureka自己的地址信息 (eureka也会把自己的信息注册进去)
          defaultZone:  http://localhost:10086/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    启动该模块,就能看到这样的信息
    在这里插入图片描述

    Eureka服务注册

            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
                <version>3.0.3version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    spring:
      application:
        name: orderService		# 服务名称不能使用下划线
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:10086/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Eureka服务拉取

    基于服务名称来进行拉取

        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
    //        String url = "http://localhost:8081/user/" + order.getUserId();
    //        将IP地址和端口号改为服务名称
            String url = "http://userService/user/" + order.getUserId();
            User user = restTemplate.getForObject(url, User.class);
            // 3.填充
            order.setUser(user);
            // 4.返回
            return order;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    实现原理:
    发起请求后会被LoadBalancerInterceptor负载均衡拦截器所拦截,将服务名称提取交给RibbonLoadBalancerClient处理。
    RibbonLoadBalancerClient依据服务名称从DynamicServerListLoadBalancer中获取真实的IP地址端口号列表,再依据IRule
    负载均衡策略,去选择一个最终的。
    调整负载均衡策略:
    第一种方式:作用是全局的

    @Bean
    public IRule randomRule(){
    	return new RandomRule();
    }
    
    • 1
    • 2
    • 3
    • 4

    第二种方式:针对某个服务

    userService:
    	ribbon:
    		NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule	
    
    • 1
    • 2
    • 3

    Ribbon默认采用懒加载,第一次访问时才会创建LoadBalanceClient,请求时间会较长。
    饥饿加载会在项目启动时创建,降低第一次访问的耗时

    ribbon:
    	eager-load:
    		enabled: true
    		clients: userService		# 针对的服务
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【Linux】Linux背景、环境的搭建以及用XShell实现远程登陆
    MySql常见复合查询(重点)
    Mac搭建Jmeter分布式加压步骤
    可编程 USB 转串口适配器开发板的详细接口与功能
    OpenAI推出首个AI视频模型Sora:重塑视频创作与体验
    田忌赛马(贪心算法)
    SpringBoot上传文件夹
    《吐血整理》高级系列教程-吃透Fiddler抓包教程(34)-Fiddler如何抓取微信小程序的包-上篇
    49-OpenCv深入分析轮廓
    Educational Codeforces Round 138 (Rated for Div. 2)-赛后总结
  • 原文地址:https://blog.csdn.net/qq_53318060/article/details/126046733