Feign使用的简单实现

项目具体结构如下:

8ACE3B36-28B0-AD55-6CA2-EAB6D3575826.png

有一个服务提供者项目:eureka-client

有一个feign客户端项目:eureka-feign-client

有一个eureka服务注册中心:eureka-server

eureka-server详情如下:

配置类:

server:
  #端口号
  port: 8761
eureka:
  instance:
    #设置主机ip以及是否提交ip信息
    prefer-ip-address: true
    hostname: localhost
    service-url:
       #服务注册地址
       defaultZone: http://${eureka.instance.hostname}:8761/eureka/
  client:
    register-with-eureka: false
    fetch-registry: false

启动类,通过@EnableEurekaServer开启Eureka服务端

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

eureka-client详情如下:

配置类:

server:
  #端口号
  port: 8763 #8762
eureka:
  client:
    service-url:
     #服务注册地址,这里填的是之前在Eureka Server配置的服务注册地址,只要有Eureka Client上线,就会向这个地址注册
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
   #服务名
    name: eureka-client

该客户端提供了一个服务,代码如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/helloWorld")
public class HelloRibbonController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/{name}")
    public String helloRibbon(@PathVariable("name") String name) {
        return "hello    " + name + ",this eureka port is  " + port;
    }
}

启动类,通过@EnableEurekaClient开启Eureka客户端,可以注册服务和拉取服务列表

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

}

eureka-feign-client详情如下:

配置类:

server:
  port: 8765
spring:
  application:
    name: eureka-feign-client
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

启动类,通过@EnableEurekaClient开启eureka客户端,通过@EnableFeignClients开启feign客户端:

@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class EurekaFeignClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaFeignClientApplication.class, args);
    }
    
}

feign配置文件,注入Retryer类的实例,这样在远程调用失败后,feign会进行重试:

@Configuration
public class FeignConfig {
    @Bean
    public Retryer FeignRetryer() {
        return new Retryer.Default();
    }
}

定义一个远程调用的接口,fegin用的是声明式Api:

@Component
@FeignClient(name = "eureka-client")
public interface FeignInterface {

    @GetMapping(value = "/helloWorld/{name}")
    String feignClient(@PathVariable("name") String name);
}

@FeignClient(name = “eureka-client”)里的name就是我们提供的服务名称,可以看到我们定义这个接口路径,就像我们之前定义controller层接口一样,同时这里的路径名加上参数要和远程调用的方法一致。

写个Service调用接口,这样好做扩展,以后要是远程过来的数据要做什么转换,但是只是在这个页面做转换,而其他地方还是不变,所以写个Service层出来做隔离挺好的,比controller层直接调用第三方会好些:

@Service
public class FeignService {

    @Autowired
    private FeignInterface feignInterface;

    public String feignClient(String name) {
        return feignInterface.feignClient(name);
    }
}

写个Controller调用service层的接口:

@RequestMapping("/feign")
@RestController
public class FeignController {

    @Autowired
    private FeignService feignService;

    @GetMapping("/{name}")
    public String helloFeign(@PathVariable("name") String name) {
        return feignService.feignClient(name);
    }
}

这样简单的feign使用demo就实现了,接下来启动各个项目,其中eureka-client启动两个服务,端口分别是8762,8763这样就有两个服务节点了,看看效果:

浏览器输入:http://localhost:8765/feign/AA

会轮流调用两个服务节点:

35628A79-90D7-99D6-1AEA-25937BB601E2.png

5838F7EE-0B27-28FB-4F89-573DD8C366D6.png

这里feign客户端为我们做到了负载均衡,我们看下他的起步依赖spring-cloud-starter-openfeign

AFE36878-050A-7DD4-6127-62FDF196E5B4.png

发现他里面已经集成了ribbon,而ribbon正是springcloud的负载均衡组件,也就不难理解为什么使用fegin客户端可以做到负载均衡了。

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据