在springcloud基本组件(一)和springcloud基本组件(二)的基础之上,引入Feign
注:图中应该是消费工程
1,修改通用工程
1,新增依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2,创建远程调用接口
package com.dwsoft.myspringcloud.api;
import com.dwsoft.myspringcloud.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @author tlk
* @date 2020/7/14-9:50
*/
@Component //按道理不加这个注解也可以,但是在DoUserController.java中没法注入,加上也不影响
@FeignClient("my-springcloud-provider") //指定服务名称
public interface UserRemoteService {
@RequestMapping("/provider/get/user/by/id")
public User getUserById(@RequestParam("userId") Integer userId);
}
2,修改消费工程
1,主启动类增加注解 @EnableFeignClients
package com.dwsoft.myspringcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author tlk
* @date 2020/7/13-14:50
*/
@EnableFeignClients //启用 Feign 客户端功能
@SpringBootApplication
public class ConsumerMain {
public static void main(String[] args) {
SpringApplication.run(ConsumerMain.class,args);
}
}
2,控制类增加远程调用方法@RequestMapping("/consumer/get/user/by/id"),全部代码:
package com.dwsoft.myspringcloud.controller;
import com.dwsoft.myspringcloud.api.UserRemoteService;
import com.dwsoft.myspringcloud.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author tlk
* @date 2020/7/13-14:56
*/
@RestController
public class DoUserController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private UserRemoteService userRemoteService;
@RequestMapping("/consumer/get/user")
public User getUser() {
String host = "http://my-springcloud-provider";//服务提供工程的配置文件
String url="/provider/get/user"; //服务提供工程的controller
return restTemplate.getForObject(host+url,User.class);
}
@RequestMapping("/consumer/get/user/by/id")
public User getUserById(@RequestParam("userId") Integer userId) {
return userRemoteService.getUserById(userId);
}
}
3,改造提供服务工程
1,控制类中增加远程调用的方法,供消费者调用
package com.dwsoft.myspringcloud.controller;
import com.dwsoft.myspringcloud.entity.User;
import org.springframework.http.HttpRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @author tlk
* @date 2020/7/13-14:40
*/
@RestController
public class UserController {
@RequestMapping("/provider/get/user")
public User getUser(HttpServletRequest httpServletRequest){
int serverPort = httpServletRequest.getServerPort();
return new User(123,"小明 端口号"+serverPort,"123@qq.com");
}
@RequestMapping("/provider/get/user/by/id")
public User getUserById(@RequestParam("userId") Integer userId){
return new User(userId,"小明 接收到的id"+userId,"123@qq.com");
}
}
4,启动相关服务,测试
声明式调用远程方法Feign测试成功!