前面我们讲了Nacos 作为注册中心的使用方法,Eureka的使用方法则更为简便,而结合RestTemplate 和Feign进行远程调用则几乎相同。
首先创建一个eureka-server项目作为注册中心服务。
引入依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RC2</spring-cloud.version>
</properties>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<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
配置文件
server:
port: 8081
eureka:
instance:
hostname: 127.0.0.1
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:8081/eureka/
spring:
application:
name: service-01
启动项目,访问http://127.0.0.1:8081
创建provider项目,引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<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>
启动类加注解:@EnableEurekaClient
配置文件配置注册中心server的地址:
eureka:
client:
serviceUrl: #注册中心地址
defaultZone: http://127.0.0.1:8081/eureka/
healthcheck: #开启健康检查 ,手动改变客户端状态
enabled: true
server:
port: 8082
spring:
application:
name: service-02
创建consumer项目,启动类添加注解@EnableFeignClients
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<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>
配置文件配置注册中心地址:
server:
port: 8083
eureka:
client:
service-url: #注册中心地址
defaultZone: http://127.0.0.1:8081/eureka/
spring:
application:
name: service-consummer
启动项目provider和consumer,成功注册到注册中心:
整合RestTemplate 进行远程调用和nacos 没有区别。今天我们采用整合feign的方式进行调用。
在provider项目中创建controller,作为提供者
@RestController
public class Controller{
@GetMapping("/getUser")
public Map<String,Object> getUser(Integer id){
Map<String,Object> data = new HashMap<>();
data.put("id",id);
data.put("userName","admin");
data.put("from","provider-A");
return data;
}
/**
*GET方法中,@RequestParam()接收引用类型参数
*/
@GetMapping("/getMap")
public Map<String,Object> getMap(@RequestParam() Map<String, Object> map){
Map<String,Object> data = new HashMap<>();
data.put("id",map.get("id"));
data.put("userName",map.get("name"));
data.put("from","provider-A");
return data;
}
/**
*POST方法中,@RequestBody接收引用类型参数
*/
@PostMapping("/postMap")
public Map<String, Object> postMap(@RequestBody Map<String, Object> map) {
Map<String,Object> data = new HashMap<>();
data.put("id",map.get("id"));
data.put("userName",map.get("name"));
data.put("from","provider-A");
return data;
}
}
在consumer中添加feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
根据provider中提供者的API创建接口,作为服务调用,并通过添加注解@FeignClient的形式引入Feign
@FeignClient(name="service-02")
public interface UserApi{
/**
* GET方法,有参数,必须添加@RequestParam()注解
*/
@GetMapping("/getUser")
public Map<String,Object> getUser(@RequestParam("id") Integer id);
@GetMapping("/getMap")
public Map<String,Object> getMap(@RequestParam() Map<String,Object> map);
/**
* POST方法,无需@RequestParam()
*/
@PostMapping("/postMap")
Map<String, Object> postMap(Map<String, Object> map);
}
创建Controller
@RestController
public class Controller{
@Autowired
UserApi userApi;
@RequestMapping("/getUser")
@ResponseBody
public Map<String,Object> getUser(){
final Map<String, Object> user = userApi.getUser(100);
return user;
}
@RequestMapping("/getMap")
@ResponseBody
public Map<String,Object> getMap(){
HashMap<String, Object> map1 = new HashMap<>(2);
map1.put("id", "3000");
map1.put("name", "ccc");
final Map<String, Object> integerStringMap = userApi.getMap(map1);
return integerStringMap;
}
@RequestMapping("/postMap")
@ResponseBody
public Map<String,Object> postMap(){
HashMap<String, Object> map1 = new HashMap<>(2);
map1.put("id", "2000");
map1.put("name", "凯");
final Map<String, Object> integerStringMap = userApi.postMap(map1);
return integerStringMap;
}
}
访问http://127.0.0.1:8083/getMap
调用成功
自行测试其他接口。
我们看到,当provider中出现提供调用的接口的时候,只要我们在consumer中添加相同的API即可。这样的好处是如果我们做跨语言的异构平台,则会很方便。
但是如果我们的服务都是java语言,这种consumer中的硬编码则看起来并不是那么方便。
我们可以将provider中可提供调用的方法单独抽象出一个API服务,然后打包下发到提供者和消费者项目中。使用时同Dubbo一样,只需要引入相应接口。
1.创建API项目,创建API接口。
install项目,并在provider和consumer中引入该项目。
在provider端,提供服务的Controller类实现 Api接口,重写getApi()方法:
consumer端的 Feign接口继承Api接口:
controller中直接调用getApi()
访问http://127.0.0.1:8083/getApi
成功返回