• springcloudalibaba架构(1):如何实现服务调用Ribbon和Feign


    前言

    基于spring cloud alibaba的架构,如何实现服务调用。

    本章代码已分享至Gtiee :https://gitee.com/lengcz/springcloudalibaba01.git

    环境准备

    代码准备和说明

    • common 公共模块,存放实体类等信息,公共工具等信息
    • order 订单模块 订单业务
    • product 商品模块 商品业务
    • user 用户模块
      在这里插入图片描述

    第一节 将服务注册到nacos

    需要将几个模块都注册到nacos

    1. 导入依赖
    <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 主类上启动服务发现的注解 @EnableDiscoveryClient
    @SpringBootApplication
    @EnableDiscoveryClient //启动服务发现
    public class ProductApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProductApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 配置nacos注册中心的地址
    spring: 
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 启动服务,可以发现(微服务名称为spring.application.name)
      在这里插入图片描述

    第二节 服务调用

    1. 从nacos获取服务列表,手动调用

    使用DiscoveryClient从nacos列表中获取服务实例,并手动调用

            /**
             * 手动从nacos获取服务列表,再手动调用的方式
             */
            ServiceInstance instance=discoveryClient.getInstances("server-product").get(0);
            Product product = restTemplate.getForObject("http://"+instance.getHost()+":"+instance.getPort()+"/product/" + pid, Product.class);
            log.info("查询到的商品内容:" + JSON.toJSONString(product));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2. Ribbon负载均衡

    2.1 如何添加负载均衡

    1. 给RestTemplate添加注解@LoadBalanced
        @Bean
        @LoadBalanced //启动负载均衡
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 修改调用代码
    //server-product为被调用的服务名
    Product product = restTemplate.getForObject("http://server-product/product/" + pid, Product.class);
    
    • 1
    • 2
    1. 启动两个product服务,可以发现nacos控制台有两个实例
      在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    4. 重启order多次请求创建订单接口,观察日志,可以看到product的两个服务实例都有被调用。
    在这里插入图片描述

    2.2更换负载均衡策略

    需要在调用方配置此项

    #配置负载均衡器
    server-product.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
    
    • 1
    • 2

    3. 基于feign的远程调用

    Feign是Spring Cloud提供的一种声明式的伪http客户端,它调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加注解即可。
    nacos很好的兼容了Feign,Feign默认集成了Ribbon,所以在nacos下使用Feign默认就实现了负载均衡。

    3.1 如何使用Feign

    1. 添加依赖
    <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    1. 在主类开启Feign的客户端@EnableFeignClients
    @SpringBootApplication
    @EnableDiscoveryClient //启动服务发现
    @EnableFeignClients //开启feign的客户端
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    
        @Bean
        @LoadBalanced //启动负载均衡
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 在order模块里定义ProductService的接口
    @FeignClient(value="server-product") //指向server-product服务
    public interface ProductService {
    
        @RequestMapping("/product/{pid}")
        Product findById(@PathVariable  Integer pid);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 使用这个Feign客户端接口
     @Autowired
        private ProductService productService;
    
        @GetMapping("/order/prod/{pid}")
        public Order order(@PathVariable Integer pid) {
            log.info("调用商品服务,调用商品微服务查询此商品");
    
            /**
             * Ribbon负载均衡
             */
            Product product = productService.findById(pid);
            log.info("查询到的商品内容:" + JSON.toJSONString(product));
    
            Order order = new Order();
            order.setUid(1);
            order.setUsername("测试");
            order.setPid(pid);
            order.setPrice(product.getPrice());
            order.setPname(product.getPname());
            order.setNumber(1);
    
            orderService.createOrder(order);
            log.info("用户下单成功,订单信息为:" + JSON.toJSON(order));
    
            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
    1. 请求测试,发现同样可以请求到远程的product服务。
      在这里插入图片描述
  • 相关阅读:
    分部积分法
    31C++编程提高篇----2、类模板原理
    vue实现响应式改变scss样式
    linux网络编程之TCP协议编程
    Java中ReentrantLock测试线程的安全
    领域适应Domain Adaptation
    大数加减,不使用BigInt,可以采用进位运算
    观测云产品更新 | Pipelines、智能监控、日志数据访问等
    JavaScript -- 字符串常用方法及示例代码介绍
    高通SDX12:Keypad按键相关(PowerKey、Reset)
  • 原文地址:https://blog.csdn.net/u011628753/article/details/126154874