【教程】IDEA创建SpringCloud ( 一 ) Eureka Server服务端项目
【教程】IDEA创建SpringCloud ( 二 ) Eureka Client 客户端项目
【教程】IDEA创建SpringCloud ( 三.一 ) RestTemplate+Ribbon 服务消费者 使用者
【教程】IDEA创建SpringCloud+Eureka+Zuul ( 三.二 ) Eureka Feign (Eureka推荐) 服务消费者 使用者
代码参考:https://gitee.com/guanweiCode/SpringCloudGw
一 Eureka Server 注册中心
二 Eureka Client 服务提供者
三.一 RestTemplate+Ribbon 服务消费者 使用者
三.二 Feign 服务消费者 使用者
一般不直接调用所需的微服务,而是经过 提供注册服务 的 服务器server, 获取所需的服务提供者列表(为一个列表, 此列表包含了能提供相应服务的服务器),他们也许是个集群,因此server会返回一个 ip + 端口号的表, 这种在服务消费者一方挑选服务器为自己服务器的方式是一种客户端的负载均衡(参考nginx的负载均衡)
第一种调用方式为:restTemplate+ribbon
第二种调用方式为:feign
Feign的英文含义假装,伪装
为什么叫伪装?
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
Feign是一个声明式的Web服务客户端,能够在类接口上添加注释,成为一个REST API 客户端。简单来说就是用来调用其他服务的
1.参考 三.一 创建 springcloud-eureka-serviceconsume-feign 项目
2 pom文件 增加 spring-cloud-starter-openfeign依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gw</groupId>
<artifactId>springcloud-eureka-serviceconsume-feign</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springcloud-eureka-serviceconsume-feign</name>
<!-- 引入父项目 -->
<parent>
<groupId>com.gw</groupId>
<artifactId>springcloud-gw-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<!-- 引入 openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 引入SpringCloud的euekea server依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- web服务 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 指定下载源和使用SpringCloud的版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3 yml配置文件
server:
port: 8703 #服务消费方 消费者
eureka:
instance:
prefer-ip-address: true # 将自己的ip地址注册到Eureka服务中
# hostname: localhost
client:
service-url:
# Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔
defaultZone: http://localhost:8699/eureka,http://localhost:8698/eureka,http://localhost:8697/eureka
register-with-eureka: true # 服务注册开关
fetch-registry: true # 服务发现开关
spring:
application:
name: eureka-consumer-feign #指定应用名称
4 启动类
package com.gw.eureka.serviceconsume.feign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @Title: Eureka-Feign服务消费方 消费者
* @Description: 描述
* @Version: v1.0
* @Author: Mr.Guan
* @Mail GuanWeiMail@163.com
* @DateTime: 2021-02-19
* @Project SpringCloudDemo
* @Package com.gw
*/
/**
* 当前使用Eureka的Server
* basePackages 配置feign客户端目录
*/
@EnableFeignClients(basePackages = "com.gw.eureka.serviceconsume.feign")
/**
* 使用Eureka的server
*/
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaConsumerFeignApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerFeignApplication.class, args);
}
}
5 UserClient 消费者客户端
package com.gw.eureka.serviceconsume.feign.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @Title: Feign客户端 消费者
* @Description: 用户服务
* @Version: v1.0
* @Author: Mr.Guan
* @Mail GuanWeiMail@163.com
* @DateTime: 2021-02-23
* @Project springcloud-gw-parent
* @Package com.gw.eureka.serviceconsume.feign.client
*/
@FeignClient(name = "eureka-service") //name 对应的服务名spring.application.name
public interface UserClient {
/**
* 通过用户id获取用户
* @param userId
* @return
*/
@GetMapping("/user/getUser/{userId}")
String getUser(@PathVariable("userId") String userId);
}
6
package com.gw.eureka.serviceconsume.feign.controller;
import com.gw.eureka.serviceconsume.feign.client.UserClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Title: 用户Controller
* @Description: 描述
* @Version: v1.0
* @Author: Mr.Guan
* @Mail GuanWeiMail@163.com
* @DateTime: 2021-02-23
* @Project springcloud-gw-parent
* @Package com.gw.eureka.serviceconsume.feign.controller
*/
@RestController
@RequestMapping("user")
public class UserController {
/**
* Feign客户端
*/
@Resource
private UserClient userClient;
/**
* 通过用户id获取用户信息
* 调用Feign客户端调用服务
* 请求地址:http://localhost:8703/user/getUser/张三
* @param userId
* @return
*/
@GetMapping("/getUser/{userId}")
public String getUser(@PathVariable("userId") String userId){
String user = userClient.getUser(userId);
return String.format("【Feign客户端】调用Feign接口的返回值:%s", user);
}
}
7 测试 http://localhost:8703/user/getUser/张三