环境
- IDEA
搭建eureka server
Idea 创建 项目 这边我定义得项目名为 eureka-server
pom.xml 文件如下
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
application.properties
# 应用名称
spring.application.name=eureka-server
server.port=8761
eureka.instance.hostname=eureka-server
# 本身不需要注册自己,所以将默认进行关闭
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defauleZone=http://${eureka.instance.hostname}:${server.port}/eureka/
启动文件 追加@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
END -- eureka-server 已配置好,启动即可 浏览器打开 http://localhost:8761
即可看到eureka服务页面
搭建服务1
Idea 新增项目,命名为eureka-client1记得选择是一个web服务
配置文件 application.properties
# 应用名称
spring.application.name=eureka-client1
server.port=8080
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
启动类追加eureka注解@EnableFeignClients
@EnableEurekaClient
具体内容如下
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaClient1Application {
public static void main(String[] args) {
SpringApplication.run(EurekaClient1Application.class, args);
}
}
启动,可以打开localhost:8761
我们可以看到创建得服务已注册到eureka
接下来,我们来创建一个service服务 。
创建服务项目
这里我定义为eureka-client2
配置文件 application.properties
# 应用名称
spring.application.name=eureke-client2
# 应用服务 WEB 访问端口
server.port=9990
# 注册EUREKA
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
启动文件 追加注解 @EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class EurekeClient2Application {
public static void main(String[] args) {
SpringApplication.run(EurekeClient2Application.class, args);
}
}
启动服务
到此 两个单独得服务已经创建好了
Feign 调用
参考说明 Feign原理 (图解) - 疯狂创客圈 - 博客园 (cnblogs.com)
Feign远程调用,核心就是通过一系列的封装和处理,将以JAVA注解的方式定义的远程调用API接口,最终转换成HTTP的请求形式,然后将HTTP的请求的响应结果,解码成JAVA Bean,放回给调用者
通过前面得步骤,可以发现,我在创建eureka-client1得适合增加了依赖 openFeign, 并在client1中得启动类追加了@EnableFeignClients
,当client1微服务启动时,Feign会自动进行包扫描,对加了@FeignClient
注解得接口,按照注解规则创建远程接口本地JDK Proxy 代理实例,然后将这些本地代理 注入到 Spring IOC容器中,当这些方法被调用时,由Proxy代理去完成真正得完成访问。并 返回结果。
摘抄:
远程接口得本地JDK Proxy 代理实例 特点
- Proxy代理实例: 实现一个加 @FeignClient注解得远程调用接口
- Proxy代理实例:在内部进行HTTP请求得封装,以及发送HTTP请求
- Proxy代理实例:能处理远程HTTP请求得响应,并且完成结果的额解码,然后返回给调用者
接下来,演示
在项目 eureka-client1
中 新建 feign文件夹,新建 EurekaClient2的接口,返回一个User对象
User对象
@Data
public class User {
private Long id = -1L;
private String name = "";
}
EurekaClient2 Interface
// 此处name 为服务2 也就是eureka-client2的application名称
@FeignClient(name = "eureka-client2")
public interface EurekaClient2 {
@GetMapping(value="/find/{id}")
User findUser(@PathVariable(value = "id") Long id);
}
定义一个对外的请求
@RestController
public class IndexController {
@Autowired
private EurekaClient2 eurekaClient2;
@GetMapping("/find")
public String find(Long id){
User user = eurekaClient2.findUser(id);
return user.getName();
}
}
在项目服务eureka-client2
新增一个查询 接口,User 对象跟client1中的属性一致就好了
@RestController
public class UserServiceController {
@GetMapping("/find/{id}")
public User findUser(@PathVariable(value = "id") Long id) {
if (id == 1) {
return new User(id,"张小白");
} else {
return new User(id, "Eureka-"+id);
}
}
}
重新启动两个服务 eureka-client1, eureka-client2
打开浏览器,我们输入 localhost:8880/find?id=1
则会返回 张小白
, 输入id非1的数字,则会返回 Eureka-
此处的id为您输入的数字
代码
eureka-server
eureka-client1
eureka-client2