首页 > 其他分享 >[微服务学习 --组件] 远程调用 Feign

[微服务学习 --组件] 远程调用 Feign

时间:2023-07-16 15:23:40浏览次数:37  
标签:Feign 调用 String -- spring test 组件 public cloud

一、什么是Feign:

  Feign是应用在分布式系统中,可以进行远程调用,它使得调用远程服务更为简单和直观。

 

 

  这个是Feign的基本流程。Feign在调用时可能会产生jdk代理对象,通过代理对象来调用远程的服务。该代理对象不仅可以接收到HTTP请求,而且还可以将相应信息封装为http请求作为响应发送给前端。           在调用方法处理器时,我们引入了熔断器Hystrix,在hystrix中通过调用HystrixInvocationHandler来实现远程调用。    二、流程演示:
  1.     建立Eureka远程服务注册中心
  2.     建立Client-provider  
            2.1 配置pom文件
<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
       2.2 修改配置文件application.properties
server.port=8083
spring.application.name=0704-spring-cloud-hystrix-feign
eureka.client.service-url.defaultZone=http://localhost:9100/eureka
     2.3 添加 model.User类  相当于pojo类型  添加两个属性:
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable {


    private String name;


    private int age;
}

  

            2.4 控制类 controller.TestController 
@RestController
public class TestController  {




    @RequestMapping("/test")
    public String test(){
        return "使用了feign的服务提供者";
    }




    @RequestMapping("/testParam01")
    public String testParam01(String name,int age){
        return "使用了feign的服务提供者"+name+""+age;
    }


    @RequestMapping("/testREturnUser")
    public User testREturnUser(){
        return new User("lily",24);
    }

}

 

  1.     建立Client-Consumer模块 就可以使用Feign的远程调用了
              3.1 pom文件中添加配置文件:
<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>
<dependencies>


    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>


    <!--添加断路器的依赖
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  </dependency>-->


    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>


    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

 

        3.2修改配置文件
server.port=8086
spring.application.name=0704-spring-cloud-hystrix-feign-consumer


eureka.client.service-url.defaultZone=http://localhost:9100/eureka

 

        3.3   构建model 类 和provider中的一致             3.4  构建service  这是个接口,里边的内容和provider中的     controller的方法一样,但是没有方法体。           该接口会添加一个 @FeignClient标签 这个标签可以标识该接口可以产生一个jdk代理对象,来完成远程调用。
/**添加该标签会给其创建一个代理对象 并将其代理对象加入到bean容器中
    生成的代理对象的特点:
    1.该代理对象可以处理http的请求信息,并将http请求信息进行封装
    2.该代理对象可以发送http响应
    **/
@FeignClient(name = "0704-spring-cloud-hystrix-feign",fallbackFactory = MyCallbackFactory.class)
public interface TestService {

    @RequestMapping("/test")
    public String test();

    @RequestMapping("/testParam01")
    public String testParam01(String name,int age);

    @RequestMapping("/testREturnUser")
    public User testREturnUser();
}
        3.5 创建熔断类 hystrix.MyCallbackFactory  该类会实现FallbackFactory<T>接口  接口的泛型便是我们在 第3.4步创建的service接口。           FallbackFactory接口的作用是:定义回退逻辑 在发生熔断时,可以降级服务。
@Component
public class MyCallbackFactory implements FallbackFactory<TestService> {
    @Override
    public TestService create(Throwable throwable) {
        return new TestService() {
            @Override
            public String test() {
                System.out.println(throwable.getClass());
                System.out.println(throwable.getMessage());


                return "test方法被熔断了:"+throwable.getMessage();
            }


            @Override
            public String testParam01(String name, int age) {
                return null;
            }


            @Override
            public User testREturnUser() {
                return null;
            }
        };
    }
}
          3.6   定义 controller类进行实现
@RestController
public class TestController {


    @Autowired
   private TestService testService;
    
    @RequestMapping("/test")
    public String test(){
        String body = testService.test();


        return "使用了feign的服务消费者123456...."+body;
    }


    @RequestMapping("/testParam01")
    public String testParam01(String name,Integer age){
        return "使用了feign的服务提供者...."+name+" "+age;
    }


    @RequestMapping("/testReturnUser")
    public User testReturnUser(){
        return  new User("lily",66);
    }

}
          4.测试:               4.1 首先去访问一下 Eureka注册中心  看有没有注册成功:访问:http://localhost:9100/

 

              4.2   访问 客户端的路径观察远程调用   首先分析:
在我们的 服务提供端,控制器中 我们输出的是:
@RequestMapping("/test")
    public String test(){
        return "使用了feign的服务提供者";
    }

也就是说 ,如果我们直接访问服务提供者的地址:http://localhost:8083/test得到的结果为:使用了“feign的服务提供者”。

而在我们的,服务消费端,我们控制器调用了,服务消费端的service方法,而在我们的服务消费端的service层,我们开启了远程调用@FeignClient,并且定义了逻辑回退方法,也就是FallBackFactory的实现类,也就是我们在此处会使用到回退方法,且进行远程调用,如果远程的服务提供者的方法,出现了错误,那么就会出发熔断。
controller层:
@RequestMapping("/test")
public String test(){
    String body = testService.test();
    return "使用了feign的服务消费者123456...."+body;
}

service层:
@FeignClient(name = "0704-spring-cloud-hystrix-feign",fallbackFactory = MyCallbackFactory.class)
public interface TestService {

此时访问:http://localhost:8086/test:

 

  三、总结:              1.   当我们在一个请求中需要用到另外一个请求的数据时,我们可能就会使用到远程调用了。
          2.   在使用远程调用时,注意要把pom文件中,添加对应的依赖。(服务提供者,服务消费者)
          3.    注意定义逻辑回退。
          4.    访问的应该是调用远程调用的端口。   借鉴Feign原理 (图解) - 疯狂创客圈 - 博客园 (cnblogs.com)

 

标签:Feign,调用,String,--,spring,test,组件,public,cloud
From: https://www.cnblogs.com/qiang2023/p/17557887.html

相关文章

  • 5 存储器层次结构
    到目前为止,在对系统的研究中,我们依赖于一个简单的计算机系统模型,CPU执潜令,而存能器系统为CPU存放指令和数据。在简单校型中,存体语系特是不以热的字节数组,而CPU能够在一个常数时间内访问每个存储器位置,组然花然为正露排个有效的模型,但是它没有反映现代系统实际工作的方式。实际上,......
  • day07 7.2 常用加密
    day077.2常用加密【1】字符串与字节反编译回来的代码有些字符串使用字节表示隐藏真正字符串Stringsalt="sign";System.out.println(Arrays.toString(salt.getBytes()));Stringv4=newString(newbyte[]{115,105,103,110});System.out.println(salt);Syste......
  • day07 7.1 Java中的面向对象之类与对象
    day077.1Java中的面向对象之类与对象【一】类与对象【1】类定义规范类与对象的关系类是实体对象的概念模型,笼统的,不具体的,比如人类、动物类、鸟类对象又称为实体,类具体化的表现小红/小明小猫一号/小狗一号对象中有属性,有方法不同对象属性是独有的方法是共......
  • WPF - 002 数据更新
    数据更新数据绑定不仅可以绑定现有的控件属性,也可以绑定自定义类的属性,通过INotifyPropertyChanged接口实现绑定源到绑定目标的消息通知。非列表属性的更新例如:以下代码通过定义一个User类,并将其中的Name属性绑定至TextBox的Text属性上,为了实现后台属性更新时对前台U......
  • Mycat
    概述whyJava应用程序直接访问MySQL数据库产生的问题:Java应用程序与MySQL数据库耦合;解决:引入Mycat中间件Java应用程序只需要关注Mycat,由Mycat负责与MySQL数据库通信;高访问量、高并发对数据库的压力可以增加多台MySQL......
  • 车联网平台建设方案
                         本文收集于互联网非原创或加工整理,如侵权请联系删除、请勿用于商务,仅供学习违者后果自负......
  • 高并发如何处理???
    -高并发:以后这个系统的用户肯定越来越多,我们要考虑高并发的问题。最主要的是缓存和负载均衡!!!静态资源存储在云端,并做cdn加速。Css和js做压缩再存储云端。CDN加速:尽可能避开互联网上可能影响数据传输的速度和稳定性的瓶颈和环节,使内容传输更快,更稳定。CND加速需要依靠各个网络节......
  • JVM(十五)垃圾回收器概述
    JVM(十五)垃圾回收器概述1垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现由于JDK版本的高速迭代,Java发展至今已经衍生了众多的GC版本从不同的角度分析垃圾收集器,可以将GC分为不同的类型2垃圾回收器分类按照线程数分,可以分......
  • 基于源码安装ZooKeeper
    下载ZK代码[email protected]:wangjingqian1995/zookeeper.gitcdzookeepergitcheckoutbranch-3.8设置环境变量echo"exportZOOKEEPER_HOME=/root/code/java/zookeeper">>/etc/profileecho"exportPATH=$PATH:$ZOOKEEPER_HOME/bin">>......
  • JVM(十六)七种垃圾收集器
    JVM(十六)七种垃圾收集器0垃圾回收器的组合关系:实现相连的垃圾回收器表示可以搭配使用:SerialGC-SerialOldGCParNewGC-CMSGCParallelScavengeGC-ParallelOldGC还有一条CMSGC-SerialOldGC表示CMS出现“ConcurrentModeFailure”后的备选方案(红色虚......