# 服务远程调用

# restTemplate

1. pom文件引入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-loadbalancer</artifactId>
    </dependency>

2. 在启动类注入bean,并加入@LoadBalanced注解

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

3. 库存服务Controller类

    //注入依赖
    private final RestTemplate restTemplate;

    @Autowired
    public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

    //调用商品服务
    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    public String echo(@PathVariable String str) {
        return restTemplate.getForObject("http://good-order-service/echo/" + str, String.class);
    }

4. 订单服务Controller类

    @RestController
    class EchoController {
        @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
        public String echo(@PathVariable String string) {
            return "Hello Nacos Discovery " + string;
        }
    }

# openFeign

1. 调用方依赖引入

    父模块引入依赖管理
    
    <dependencyManagement>
        <dependencies>
            <!--    引入spring-cloud的依赖        -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

         </dependencies>
    </dependencyManagement>

    子模块引入
    <!--openfeign-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!--openfeign-->

2. 调用方启动类加上注解


    @EnableFeignClients


3. 调用方编写feign客户端

    package org.example.good.controller;

    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;

    @FeignClient(value = "good-order-service")
    public interface OpenFeignClient {

        @GetMapping("/echo/{str}")
        String echo(@PathVariable("str") String str);

    }

    注意这里有个坑,就是@PathVariable("str")  注解里面要绑定参数,不能为空

4. Controller层调用


        @Autowired
        private OpenFeignClient openFeignClient;


        @RequestMapping(value = "/echo2/{str}", method = RequestMethod.GET)
        public String echo2(@PathVariable String str) {
            return openFeignClient.echo(str);
        }

5. Feign是同步调用,如果异步可以使用MQ,Feign也支持直接调用其他服务,可以不通过nacos等注册中心中转

    @FeignClient(name = "feignTest", url = "localhost:8081/feign")
    public interface TestApi {
        @GetMapping("test/{data}")
        String test1(@PathVariable("data") String data);


    }