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系列教程