Hello大家好,我是初晨,本章我们学习SpringCloud 组件间通信。大家有问题和意见可以发邮箱mr_beany@163.com

一:创建一个SpringCloud Client

创建过程与 SpringCloud 实战二:Client的创建和高可用 一样

我这里服务名称叫Servce,大家随意创建

创建好的服务结构和配置文件如下


配置端口为8083


先后启动Eureka,Client和Servce

访问 http://localhost:8761/


新创建的servce服务已经注册成功

二:创建Controller

在servce服务中创建ServerController

package com.example.server.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServerController {

    @GetMapping("getMsg")
    public String getMsg(){
        return "This is ServerMsg";
    }
}
复制代码

三:使用RestTemplate的方式

1:创建ClientController.java

package com.chuchen.client.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ClientController {

    @GetMapping("/getServerResult")
    public String getServerResult(){
        return restTemplate.getForObject("http://localhost:8083/getMsg",String.class);
    }
}复制代码

重新启动服务,浏览器输入

http://localhost:8081/getServerResult


我们可以看到从Client服务,调用servce服务的返回结果

2:优化

我们前面说到,SpringCloud个组件是高可用的,我们每个服务有可能布置多个服务,甚至在不同机器上,可能服务的IP和端口都不一样,我们上面这种方式明显不符合我们的需求,那么怎么优化呢?

1:创建config→RestTemplateConfig.java

package com.chuchen.client.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
复制代码

2:修改ClientController.java

package com.chuchen.client.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ClientController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getServerResult")
    public String getServerResult(){
        //其中 SERVER 为需要请求的服务的名称
        return restTemplate.getForObject("http://SERVER/getMsg",String.class);
    }
}
复制代码

重新启动服务,浏览器输入

http://localhost:8081/getServerResult


我们可以看到仍然是可以得到请求结果的。

四:使用openfeign

1:引入openfeign依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>复制代码

2:启动类添加@EnableFeignClients


3:创建client→ServerClient

package com.chuchen.client.client;

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

//name属性的值为需要调用的组件名称
@FeignClient(name = "server")
public interface ServerClient {

    //需要调用的方法
    @GetMapping("/getMsg")
    String getMsg();
}
复制代码

4:修改ClientController

package com.chuchen.client.controller;

import com.chuchen.client.client.ServerClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ClientController {

    @Autowired
    private ServerClient serverClient;

    @GetMapping("/getServerResult")
    public String getServerResult(){
        return serverClient.getMsg();
    }
}
复制代码

5:测试

重新启动服务,浏览器输入

http://localhost:8081/getServerResult


五:结尾

感谢大家支持,系列文章接下来陆续更新,感谢大家。

对于springBoot还不了解的朋友可以看我的SpringBoot系列教程