SpringCloud基础组件完结--第七章
作者:互联网
SpringCloud基础组件完结(第六章用的是RestTemplate远程调用,现在讲的是OpenFeign远程调用)
第七章 SpringCloud-Hello案例开发-Feign-声明式调用
7.1 Feign声明式调用
准备工作:
copy 之前的cloud-consumer-user模块,在夫工程下粘贴-》粘贴完成后因为他不是maven工程,所以需要让他生成一下(注意生成前先把artifactId 改成你的项目名)
<artifactId>cloud-consumer-user</artifactId>改为
<artifactId>cloud-consumer-user-feign</artifactId>
接着右键user-feign的pom.xml -》Add as Maven Project让他构建maven工程
构建完成后接着把复制过来的pom.xml 里的ribbon依赖删掉,因为openfeign自带ribbon
<!-- 引入ribbon实现远程调用和负载均衡功能 -->(删掉)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
然后把config配置类删掉
@SpringBootConfiguration (删掉)
public class MyConfig {
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean //随机服务器调用
public IRule rule(){
return new RandomRule();
}
}
UserService 实现类中 删掉
@Autowired
private RestTemplate restTemplate;
Movie movie = restTemplate.getForObject("http://CLOUD-PROVIDER-MOVIE/movie", Movie.class);
先把 改为空
map.put("moviename",null);
准备工作完成
OpenFeign更优雅的远程调用
7.2 引入eureka-Discovery、web、Feign模块
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
导入完成需要
7.2.1 开启@EnableDiscoveryClient服务发现
user-feign中程序入口加上
@SpringBootApplication
@EnableDiscoveryClient //允许发现注册中心其他的客户端
public class UserApplication {
public static void main(String[] args) {
System.out.println(SpringApplication.run(UserApplication.class,args));
}
}
7.2.2 提供个端口
spring:
application:
name: cloud-consumer-user-feign
server:
port: 7000
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true #注册中心保存我的ip
7.2.3 创建个接口MovieServiceFeign
声明式的远程调用,因为都会在统一的接口中来管理远程调用的方法,所以叫做声明式远程调用 因为就单独的声明了一个接口
-
user-feign下service新建feign实现接口MovieServiceFeign
package com.wsk.user.service.feign;
import org.springframework.cloud.openfeign.FeignClient;
@FeignClient(value = "CLOUD-PROVIDER-MOVIE")
public interface MovieServiceFeign {
}
-
接着user-feign程序入口加上@EnableFeignClients注解(第三行)
@SpringBootApplication
@EnableDiscoveryClient //允许发现注册中心其他的客户端
@EnableFeignClients //开启feign客户端功能
public class UserApplication {
public static void main(String[] args) {
System.out.println(SpringApplication.run(UserApplication.class,args));
}
}
-
紧接着开始写接口代码(找MovieController代码)
@GetMapping("/movie")
public Movie getNewMovie() {
System.out.println("port" + port);
return movieService.getNewMovie();
}
复制一下粘贴到MovieServiceFeign接口,并修改
@FeignClient(value = "CLOUD-PROVIDER-MOVIE")
public interface MovieServiceFeign {
@GetMapping("/movie")
public Movie getNewMovie();
}
-
完成user-feign中 service层的操作(注入MovieServiceFeign,new一下,返回数据)
@Service
public class UserService {
@Autowired
UserDao userDao;
public User getUserById(Integer id) {
User user = userDao.getUser(id);
return user;
}
@Autowired
private MovieServiceFeign movieServiceFeign;
public Map buyMovie(Integer id) {
//1.根据id检索用户
User user = userDao.getUser(id);
//2.远程调用movie服务获取最新的电影信息
//url指定注册中心中的服务名称/请求路径
Movie newMovie = movieServiceFeign.getNewMovie();
//3.封装map集合,返回数据
Map map = new HashMap<>();
map.put("username",user.getUserName());
map.put("moviename",newMovie.getMovieName());
return map;
}
}
到这,访问 http://localhost:7000/buyMovie?id=1
跟第六章显示的一样{"username":"张三","moviename":"战狼"}
OpenFeign内置负载均衡,默认是轮询处理
openFeign调用传参数总结:(重要)
https://blog.csdn.net/x123453316/article/details/108879921
openFeign参数传递
OpenFeign 传递参数,一定要绑定参数名,即有参数要加上 @RequestParam 注解,如果通过 Header (请求头)来传递参数,一定要中文转码,测试 provider 服务中的接口
标签:feign,调用,--,SpringCloud,MovieServiceFeign,user,public,cloud,完结 来源: https://www.cnblogs.com/wangshikang/p/16561476.html