• 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
  • 相关阅读:
    齐岳|Au/Fe3O4/壳聚糖纳米复合物|聚(苯胺-吡咯)共聚物/Fe3O4网状纳米纤维复合物PAn-co-PPy/Fe3O4
    C++环形缓冲区
    智芯微801核心板外设驱动调试经验汇总--每天加一点
    CSP-J 2023 第二轮认证入门级(含答案)
    Arduino ESP32使用U3115S芯片控制H桥驱动有刷直流电机
    Qt出现假死冻结现象
    既不是研发顶尖高手,也不是销售大牛,为何偏偏获得 2 万 RMB 的首个涛思文化奖?
    Python爬虫实战:自动化数据采集与分析
    solidity 存储 /变量
    搜维尔科技:【软件篇】TechViz是一款专为工程设计的专业级3D可视化软件
  • 原文地址:https://blog.csdn.net/qq_53318060/article/details/126046733