• springcloud alibaba集成feign


    创建个父工程:wenbei-mall
    在父工程中引入:

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
    
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>
    <dependencyManagement>
        <dependencies>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Hoxton.SR3version>
                <type>pomtype>
                <scope>importscope>
            dependency>
    
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>2.2.1.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    
    dependencyManagement>
    
    • 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

    在父工程下创建两个子工程,用户服务member和订单服务order。用户服务依赖订单服务的接口。

    订单服务pom文件引入依赖

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    启动类:

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

    订单controller:

    @RestController
    public class OrderController {
    
        @Autowired
        private OrderService orderService;
    
        @RequestMapping(value = "/create", method = RequestMethod.POST)
        public Result create(@Valid @RequestBody OrderCreateParam orderCreateParam) {
            orderService.createOrder(orderCreateParam);
            return Result.success("订单创建成功");
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    OrderService业务层实现:

        @Override
        public void createOrder(OrderCreateParam orderCreateParam) {
            //校验参数
            validOrderCreateParam(orderCreateParam);
    
            OrderDto orderDto = saveOrder(orderCreateParam);
    
            sendMessage(orderDto);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里的重点不是业务层代码,均为空方法。

    application.yml配置。基本的配置及nacos的地址

    server:
      port: 19278
      servlet:
        context-path: /order
    spring:
      application:
        name: mall-order
      cloud:
        nacos:
          server-addr: 127.0.0.1:8848
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    至此,Order服务的下单接口已完毕。

    用户服务pom文件引入依赖

    <dependency>
    	<groupId>org.springframework.cloudgroupId>
    	<artifactId>spring-cloud-starter-feignartifactId>
    	<version>1.4.7.RELEASEversion>
    dependency>
    <dependency>
    	<groupId>com.alibaba.cloudgroupId>
    	<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    启动类:

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

    用户服务主配置类:

    @Configuration
    @EnableDiscoveryClient
    public class MainConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    用户服务controller层调用order服务下单接口

    @RequestMapping("/createOrder")
    public String createOrder() {
        //构造请求参数
        OrderCreateParam orderCreateParam = new OrderCreateParam();
        orderCreateParam.setUserId(1233L);
        orderCreateParam.setShippingAddressId(123L);
        List<OrderItem> orderItemList  = new ArrayList<>();
        orderCreateParam.setOrderItemList(orderItemList);
        OrderItem orderItem = new OrderItem();
        orderItem.setSkuId(1231234L);
        orderItem.setQuantity(2);
        orderItemList.add(orderItem);
        //调用订单服务
        Result result = orderService.create(JSONObject.toJSONString(orderCreateParam));
        log.info("result===》{}", result);
        return result.toString();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    orderService.create方法:

    @FeignClient(name = "mall-order", path = "/order")
    public interface OrderService {
          @RequestMapping(value = "/create", method = RequestMethod.POST)
          Result create(OrderCreateParam orderCreateParam);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里的OrderCreateParam和order服务里的OrderCreateParam 是完全不同的类,在各自的工程里,Result也是。不过可以提取公共的打成jar藏到公共仓库。类似于dubbo中的api层。

    这里的入参和出参都为对象,实际返回的是字符串,feign会为我们自动转成对象。这里的入参和出参都可以改为String,也可以任意组合,及入参为String,出参为对象,或入参为对象,出参为String。

    如下代码所示,入参直接写成String,那么在传入前需要转成JSON字符串。

    @RequestMapping(value = "/create",method = RequestMethod.POST,produces = "application/json",headers = "content-type=application/json")
    String create(String orderCreateParam);
    
    • 1
    • 2

    不过,此时可能需要在headers 加content-type=application/json参数,这取决于服务方接口是如何接收参数的。可以回到刚刚的order服务下单接口那里,可以看到入参加了@RequestBody注解,这意味着请求时content-type要为application/json类型,即,参数以JSON方式传递。如果这里的的入参写的是String,则需要手动指定content-type=application/json,而上述参数为对象格式的无需指定,为什么?我的猜想,因为写String类型,框架并不知道要用哪种格式,默认为text/plain,但是order服务的下单接口入参上加了@RequestBody,表明需要为application/json类型。而为对象是不需要,我想是框架自动识别了吧。

    至此,spring cloud alibaba集成feign已经完成。

    源码:
    gitee地址: https://gitee.com/it-wenbei/wenbei-mall.git

  • 相关阅读:
    Codeforces Round 908 (Div. 2)
    【Web基础篇】Servlet原理
    Postgresql中的变长参数类型VARIADIC实例与限制
    P3613 【深基15.例2】寄包柜题解
    2023.9.8 基于传输层协议 UDP 和 TCP 编写网络通信程序
    java计算机毕业设计快递代收系统源码+系统+数据库+lw文档+mybatis+运行部署
    神经网络算法和人工智能,人工智能神经网络技术
    在C#中使用NModbus4通信库执行【读】操作
    es的nested查询
    在 M1/M2 Mac 上,让 Windows 11 免费“跑”起来!
  • 原文地址:https://blog.csdn.net/ibigboy/article/details/126589534