Hello大家好,我是初晨,本章我们学习SpringCloud 组件间通信。大家有问题和意见可以发邮箱mr_beany@163.com
创建过程与 SpringCloud 实战二:Client的创建和高可用 一样
我这里服务名称叫Servce,大家随意创建
创建好的服务结构和配置文件如下
配置端口为8083
先后启动Eureka,Client和Servce
访问 http://localhost:8761/
新创建的servce服务已经注册成功
在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"; } } 复制代码
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服务的返回结果
我们前面说到,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
我们可以看到仍然是可以得到请求结果的。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>复制代码
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(); } 复制代码
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(); } } 复制代码
重新启动服务,浏览器输入
http://localhost:8081/getServerResult
感谢大家支持,系列文章接下来陆续更新,感谢大家。
对于springBoot还不了解的朋友可以看我的SpringBoot系列教程