feign客户端调用eureka服务时首先会在注册中心获取服务列表,从而确定服务基本信息以及地址信息,所以首先必须保证你的feign客户端是可以注册到eureka注册中心上的,单独注册feign客户端服务是可以注册进去。
在2.0之后feign客户端依赖信息修改,2019-03-12的依赖信息(当日亲测可用):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.eureka</groupId>
<artifactId>member</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>member</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--注意:此处必须要添加,否则各种依赖有问题-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot整合Eureka客户端-->
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在确定了自己的feign调用服务是可以直接注册到eureka上之后,需要注意的问题是:服务注册的先后问题,不能直接将生产者服务与消费者服务同时注册会出现找不到服务的情况。原因是在服务注册之后程序会默认读取现存在Eureka上的服务列表缓存进自身之中,同时注册的话会使得获得列表中缺少相应的服务信息。(就是生产者与消费者同时开,消费者就找不到生产者了),应该先开生产者服务之后再开启消费者服务。
如果同时开启了服务的话会报如下错误,
这个地方有个很玄学的情况,有的时候在这个错误出现之后刷新过一会错误就消失了,但也有的时候怎么刷新都报错。
以下为测试的基本代码:
application.yml
server:
port: 8200
spring:
application:
name: appmeiszl
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8100/eureka/
instance:
appname: testmeiszl111
register-with-eureka: true
fetch-registry: true
启动方法:
package com.meiszl.eureka_order_fegin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaOrderFeginApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaOrderFeginApplication.class, args);
}
}
feignapi接口:
package com.meiszl.eureka_order_fegin.FeginApi;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "appmeiszl")//APP-MEISZL-MEMBER
public interface MemberOrderFegin {
@RequestMapping("/getMember")
public String getMember();
}
Controller接口:
package com.meiszl.eureka_order_fegin.Controller;
import com.meiszl.eureka_order_fegin.FeginApi.MemberOrderFegin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FeignController {
@Autowired
private MemberOrderFegin memberOrderFegin;
@RequestMapping("/getMember")
public String test(){
System.out.println("feign调用member");
return memberOrderFegin.getMember();
}
}
此处的Controller接口也出现了一个神奇的问题,就是如果此处的RequestMapping与你的feign接口的RequestMapping配置的地址不一致的话会出现下面的这种情况。
会变成这两个页面轮训变化,第一次刷新是正常的第二次就报找不到服务接口的错误,第三次又正常了一直轮训变换,这个现在并不知道是怎么回事。
关于网上说的加ribbon.eureka.enabled=true的方法一般是用于zuul网关配置的时候,如果是自己测试出现了Load Balancer错误,可以先仔细检查一下到底是不是现有生产者服务再开启的消费者服务以及注册中心上能不能搜索到两个服务信息。