三、springCloudAlibaba基础篇(openFegin远程调用)
一、环境准备
二、新增依赖与配置文件
三、代码编写
3.0、项目结构截图
3.1、消费者和提供者启动类
3.2、用户模块代码
3.3、消费者模块代码
3.4、 访问页面调用即可
3.5、 测试超时
一、环境准备
在上一篇文章编写的代码基础上改进,会nacos注册的话,可以不用看 → 一、springCloudAlibaba基础篇(nacos注册中心、配置中心)
二、新增依赖与配置文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
ribbon:
#项目启动时,两端建立连接时间
ReadTimeout: 5000
#访问超时
ConnectTimeout: 5000
#重试次数设置为0,不让它重试
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 0
# 如果上面的超时时间设置不管用,可以试试这个
#feign:
# client:
# config:
# default:
# ConnectTimeOut: 5000
# ReadTimeOut: 5000
三、代码编写
3.0、项目结构截图
没有多少代码,看着是不是一点也不害怕
3.1、消费者和提供者启动类
在主启动类使用@EnableFeignClients,消费者和服务提供者都加上
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.2、用户模块代码
没啥讲的,就是一个controller与service。
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("user/info")
public String info(@RequestParam("name") String name, @RequestParam("pwd") String pwd){
return userService.info(name, pwd);
}
@GetMapping("user/findOne/{id}")
public String findOne(@PathVariable("id") String id) {
return userService.findOne(id);
}
}
public interface UserService {
public String info(@RequestParam("name") String name, @RequestParam("pwd") String pwd);
public String findOne(@PathVariable("id") String id);
}
@Service
public class UserServiceImpl implements UserService{
// 假装是个数据库
static HashMap<String ,String> map1 = new HashMap<>();
static HashMap<String ,String> map2 = new HashMap<>();
static {
map1.put("彼岸花","123456");
map2.put("1" , "彼岸花");
}
@Override
public String info(String name, String pwd) {
if(map1.containsKey(name) && map1.get(name).equals(pwd)){
return "欢迎您:" + name;
}
return "用户或密码错误";
}
@Override
public String findOne(String id) {
if(map2.containsKey(id)){
return map2.get(id);
}
return "ERROR";
}
}
3.3、消费者模块代码
应该把用户当消费者模块用来着,懒得改了。而且服务消费者也可以是服务提供者,迟早也得调用其他服务
把用户模块的接口拿过来,使用@FeignClient注解,并把要调用的微服务名称填写进去,还有调用方式
注:多个参数传递时必须添加@RequestParam()注解
注:不要再openFegin接口中写没有指向的方法,否则会启动报错,比如下图代码注释的部分解开
@Component
@FeignClient(name="user01")
public interface UserService {
@GetMapping("user/info")
public String info(@RequestParam("a") String a,@RequestParam("b") String b);
@GetMapping("user/findOne/{id}")
public String findOne(@PathVariable("id") String id);
//java.lang.IllegalStateException: Method UserService#findTwo(String) not annotated with HTTP method type (ex. GET, POST)
//public String findTwo(String id);
}
@RestController
@RequestMapping("/info")
public class InfoController {
@Autowired
UserService userService;
@GetMapping("/info")
public String info(String name, String pwd){
return userService.info(name, pwd);
}
@GetMapping("/findOne/{id}")
public String findOne(@PathVariable("id") String id){
return userService.findOne(id);
}
}
3.4、 访问页面调用即可
步骤一:先测试下用户模块能正常运作部
步骤二:在测试通过消费者调用到它
3.5、 测试超时
步骤一:修改服务提供者,UserServiceImpl的代码
@Override
public String findOne(String id) {
System.out.println("进来了....");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(map2.containsKey(id)){
return map2.get(id);
}
return "ERROR";
}
步骤二:修改消费者Controller的代码,如果配置文件没设置超时时间,此处默认时间是1秒超时
如果你测试发现此处时间大于两秒,也许是重试次数惹得锅,可以看看服务提供那边输出几次
@GetMapping("/findOne/{id}")
public String findOne(@PathVariable("id") String id){
long l = System.currentTimeMillis();
try {
return userService.findOne(id);
}catch (Exception e){
e.printStackTrace();
System.out.println(System.currentTimeMillis() - l);;
}
return "超时";
}
步骤三:因为我们业务有的比较长,两秒不够,我们调整到5秒没返回就超时(往上滑配置文件给了)
————————————————
版权声明:本文为CSDN博主「问君何为变化」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: