feign是什么
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
先搭建一个注册中心,用来服务和发现
cloud-eureka项目
pom.xml引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
启动类内容如下:
@SpringBootApplication
@EnableEurekaServer
public class CloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(CloudEurekaApplication.class, args);
}
}
application.yml配置文件如下:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
这样一个简单的注册中心就搭建完成了。。。
然后创建一个服务提供者的项目
cloud-server项目
当server向eureka注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka 从每个server实例接收心跳消息,这个操作叫做心跳检测(健康检测,服务续约)。 如果心跳超时,则通常将该实例从注册eureka中删除。
pom.xml文件引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
启动类如下:
@SpringBootApplication
@EnableEurekaClient
public class CloudServerApplication {
public static void main(String[] args) {
SpringApplication.run(CloudServerApplication.class, args);
}
}
application.yml配置文件如下:
server:
port: 2001
spring:
application:
name: cloud-server #服务的名字
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/ #ַ连接注册中心的地址
需要指明 spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。
添加一个StuController控制器类,用来提供服务
StuController类内容如下:
@RestController
public class StuController {
@Value("${server.port}")
String port;
@RequestMapping("hi")
public String hi(String name){
return "hi: "+name+" ,from port: "+port;
}
}
@Value可以将配置文件中的内容赋值进来,方便后面查看是哪个端口提供的服务。
启动这两个项目,打开 http://localhost:8761 ,即注册中心的网址,你就会看到服务提供者已经注册到注册中心了
然后在浏览器访问:http://localhost:2001/hi?name=xiao ,你就会看到如下页面:
这就说明服务提供者已经搭建成功了。。。
然后修改一下端口号,启动两个提供者和一个注册中心,以便用来实现负载均衡的功能
接下来我们再创建一个feign消费服务的项目,用Feign实现服务消费者
cloud-feign项目
pom.xml文件中引入依赖:
<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>
启动类如下:
在启动类中添加@EnableFeignClients注解开启Feign的功能
@SpringBootApplication
@EnableFeignClients
public class CloudFeignApplication {
public static void main(String[] args) {
SpringApplication.run(CloudFeignApplication.class, args);
}
}
application.yml配置文件如下:
server:
port: 3000
spring:
application:
name: cloud-feign
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
定义一个feign接口StuService,通过@FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了cloud-server 服务的"/hi"接口
StuService接口内容如下:
@FeignClient(value = "CLOUD-SERVER")
public interface StuService {
@RequestMapping(value = "/hi",method = RequestMethod.GET)
String hi(@RequestParam("name") String name);
}
然后再创建一个StuController类,在StuController中用调用StuService 的方法
StuController类的内容如下:
@RestController
public class StuController {
@Autowired
private StuService stuService;
@RequestMapping("hi")
public String hi(String name){
return stuService.hi(name);
}
}
然后在浏览器多次访问:http://localhost:3000/hi?name=xiao ;浏览器会交替显示如下页面:
到此,feign实现消费者的功能就结束了,记住feign是默认实现负载均衡功能的。。。