三、springCloudAlibaba基础篇(openFegin远程调用)

三、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版权协议,转载请附上原文出处链接及本声明。
原文链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenFeign 是一个声明式的 Web Service 客户端,它使得编写 Web Service 客户端变得更加简单。它的主要目的是使得将微服务之间的调用变得更加容易。 在 Spring Cloud 应用中,我们经常需要使用 Ribbon 和 Feign 进行服务调用,其中 Feign 封装了 Ribbon,使得我们在使用 Feign 时可以直接使用 Ribbon 的负载均衡能力。使用 Feign 可以让我们更加方便地调用 RESTful 服务。 下面是一个基本的 OpenFeign 示例: 1. 首先需要在 pom.xml 中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2. 然后在启动类上添加 `@EnableFeignClients` 注解开启 Feign 功能: ``` @SpringBootApplication @EnableFeignClients public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 3. 创建一个 Feign 接口: ``` @FeignClient(name = "service-provider") public interface HelloService { @GetMapping("/hello") String hello(); } ``` 其中 `@FeignClient` 注解用来指定服务提供者的名称,`@GetMapping` 注解用来指定要调用的服务接口。 4. 在需要调用服务的地方注入 `HelloService` 接口即可: ``` @Service public class ConsumerService { @Autowired private HelloService helloService; public String hello() { return helloService.hello(); } } ``` 这样就可以通过 Feign 调用服务提供者的接口了。需要注意的是,Feign 默认使用的是 Spring MVC 的注解和 HttpMessageConverters,因此需要保证服务提供者和服务消费者使用的是相同的注解和 HttpMessageConverters。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值