eureka与feign实现负载均衡
上一篇博文,看了ribbon借助于RESTTemplate实现负载均衡
这篇文章,看下feign实现的负载均衡效果
对比与ribbon的区别,可能主要在于feign这边多了个注解 @EnableFeignClients,接下来详细看示例过程
springboot 2.1.0.RELEASE
springcloud Greenwich.M1
pom依赖文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.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>
<spring-cloud.version>Greenwich.M1</spring-cloud.version>
</properties>
<dependencies>
<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-server</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-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>
服务注册部分
与之前代码无异,配置文件部分,修改下端口号即可
@EnableEurekaServer
@SpringBootApplication
public class FeignServicecenterApplication {
public static void main(String[] args) {
SpringApplication.run(FeignServicecenterApplication.class, args);
}
}
配置文件
server:
port: 5430 #服务注册中心端口号
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false #是否向服务注册中心注册自己
fetchRegistry: false #是否检索服务
serviceUrl: #服务注册中心的配置内容,指定服务注册中心位置
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
服务提供者
服务提供者,我们提供两个访问实例
@EnableEurekaClient
@RestController
public class HiController {
@Value("${server.port}")
private String port;
@GetMapping("/hi")
public String hello() {
return "feign-provider is server port " + port;
}
}
服务提供者这块,feign与ribbon方式没有区别,这两者做负载均衡的区别主要在于客户端,即服务调用端。
配置文件
spring.application.name=eureka-server
eureka.client.service-url.defaultZone=http://localhost:5430/eureka/
server.port=5431
与之前无异,仅修改服务注册中心地址和端口号即可
同样复制该服务提供者工程,修改配置文件端口号,则多一个服务提供实例
spring.application.name=eureka-server
eureka.client.service-url.defaultZone=http://localhost:5430/eureka/
server.port=5432
服务消费者
这里与之前有区别,需要先将要调用的外部接口定义
@FeignClient("eureka-server")
public interface HelloService {
@GetMapping("/hi")
String hello();
}
定义HelloService接口,使用@FeignClient注解,标注要调用的外部服务。服务里面定义需要访问的外部接口,并标注接口的请求url,请求的url应该与服务提供者的url相同,否则会抛404异常。
定义controller层
@EnableEurekaClient
@EnableFeignClients("com.example.consumer.service")
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@GetMapping("/hello")
public String hello() {
return helloService.hello();
}
}
这里需要使用@EnableFeignClients来标注远程接口路径,程序启动时,会检查是否有@EnableFeignClients注解,如果有,则开启包扫描,扫描被@FeignClient注解修饰的接口连同接口名和注解的信息一起取出,赋给BeanDefinitionBuilder,然后根据BeanDefinitionBuilder得到BeanDefiniton,最后将BeanDefiniton注入到Ioc容器中。这里如果EnableFeignClients后面的包路径丢失,则无法扫描到要注入的bean,会启动失败。
依次启动各服务后,可以在注册中心观察到,一个客户端和两个服务端均已成功注册到服务中心
在地址栏http://localhost:5433/hello测试
可以看到调用到5431和5432两个服务实例
至此,一个简单的feign的负载均衡demo就完成了,这里没有过多的原理讲解,只是介绍工程搭建过程。如果其中有不严谨的地方或疏漏之处,欢迎浏览批评指正。谢谢。
还没有评论,来说两句吧...