由于RPC调用需要使用注册中心,所以首先需要创建eureka服务,创建SpringBoot项目后导入spring-cloud-starter-netflix-eureka-server,注意SpringBoot和SpringCloud版本一致性,然后进行配置,启动类添加注解@EnableEurekaServer
< dependency>
< groupId> org.springframework.cloud</ groupId>
< artifactId> spring-cloud-starter-netflix-eureka-server</ artifactId>
</ dependency>
server :
port : 8761
spring :
application :
name : eureka
eureka :
client :
register-with-eureka : false
fetch-registry : false
service-url :
defaultZone : http: //localhost: 8761/eureka/
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main ( String [ ] args) {
SpringApplication . run ( EurekaApplication . class , args) ;
}
}
创建服务提供者SpringBoot应用,关键是导入spring-cloud-starter-netflix-eureka-client依赖,进行eureka的配置,编写controller接入层代码,启动类不需要加@EnableEurekaClient注解,因为在新版本中已经被移除
< 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-client</ artifactId>
</ dependency>
server :
port : 8082
spring :
application :
name : producer
eureka :
client :
register-with-eureka : true
fetch-registry : true
service-url :
defaultZone : http: //localhost: 8761/eureka/
@RestController
@RequestMapping ( "/api" )
public class DataController {
@GetMapping ( "/data" )
public String getData ( ) {
System . out. println ( "服务提供者被调用" ) ;
return "Hello from Producer!" ;
}
}
创建服务消费者SpringBoot应用,引入如下三个关键依赖,进行eureka配置,编写接口,编写接入层代码调用该接口,启动类需要加上@EnableFeignClients
< dependency>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter-web</ artifactId>
</ dependency>
< dependency>
< groupId> org.springframework.cloud</ groupId>
< artifactId> spring-cloud-starter-openfeign</ artifactId>
</ dependency>
< dependency>
< groupId> org.springframework.cloud</ groupId>
< artifactId> spring-cloud-starter-netflix-eureka-client</ artifactId>
</ dependency>
server :
port : 8083
spring :
application :
name : consumer
eureka :
client :
register-with-eureka : true
fetch-registry : true
service-url :
defaultZone : http: //localhost: 8761/eureka/
@FeignClient ( name = "producer" )
public interface ProducerClient {
@GetMapping ( "/api/data" )
String getData ( ) ;
}
@RestController
@RequestMapping ( "/consumer" )
public class ConsumerController {
@Autowired
private ProducerClient producerClient;
@GetMapping ( "/data" )
public String getDataFromProducer ( ) {
return producerClient. getData ( ) ;
}
}
@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication {
public static void main ( String [ ] args) {
SpringApplication . run ( ConsumerApplication . class , args) ;
}
}
总结
通过引入eureka注册中心后,如果服务提供者有多个节点,那么请求就会被发送到存活的节点上,实现了动态路由,避免因为固定写url但是该节点宕机导致调用失败的问题 Feign并不是RPC(远程过程调用),本质上还是基于HTTP,就算是因为服务提供者的api.jar,调用期中的接口,也只是基于HTTP协议的调用,只是不用写HTTP客户端,一切都是组件通过动态代理生成的