版本
- Spring Cloud 3.1.1
- spring cloud loadbalancer 3.1.1
- nacos 2021.1
- open feign 3.1.1
引入依赖
在项目的 pom.xml 文件中添加相关依赖:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</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-loadbalancer</artifactId>
</dependency>
配置Nacos
在 application.yml 中配置Nacos服务发现和Feign的相关设置:
yaml
spring:
application:
name: service-consumer # 当前服务名
cloud:
nacos:
discovery:
server-addr: localhost:8888 # Nacos服务地址
loadbalancer:
retry: true # 启用重试机制
feign:
client:
config:
default:
connect-timeout: 5000
read-timeout: 5000
主应用类
在主应用类中启用Feign客户端和Nacos服务发现:
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
创建Feign客户端接口
定义一个接口,用于调用另一个服务的API:
java
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = "service-provider") // 这里的name是被调用服务的名称
public interface ServiceProviderClient {
@GetMapping("/api/hello")
String sayHello(@RequestParam(name = "name") String name);
}
使用Feign客户端
在你的控制器或服务中使用Feign客户端进行服务调用:
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerController {
@Autowired
private ServiceProviderClient serviceProviderClient;
@GetMapping("/hello")
public String hello(@RequestParam(name = "name") String name) {
return serviceProviderClient.sayHello(name);
}
}
配置Nacos服务注册和发现
确保在被调用的服务(例如service-provider)的 application.yml 中配置了Nacos服务注册:
yaml
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: localhost:8888 # 注册中心地址
在 service-provider 项目的主应用类中也需要启用服务发现:
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
并在service-provider项目中实现对应的控制器方法:
java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
@GetMapping("/api/hello")
public String sayHello(@RequestParam(name = "name") String name) {
return "Hello, " + name + "!";
}
}
启动服务
启动Nacos Server后,依次启动service-provider和service-consumer服务。访问service-consumer服务的 /hello 接口,验证服务间调用是否成功。
例如,访问 http://localhost:8090/hello?name=World 应该会调用service-provider服务的API,并返回 "Hello, World!"。
通过上述步骤,你已经成功整合了Spring Cloud、Spring Cloud LoadBalancer、Nacos和OpenFeign,实现了微服务之间的调用。