OpenFeign+NACOS实现服务的注册与发现和负载均衡
开发环境
基于:IntelliJ IDEA
、Maven构建工具
、JDK1.8
、SpringBoot 2.3.4
、Spring4.3.28
编写。
官人如需使用 IDEA 请阅读教程:IntelliJ IDEA
官人如需使用 Maven 请阅读教程:Maven 构建工具的下载与安装
更多干货
请参考:《穿越 Java 之 语法基础篇》 系列文章
请参考:《穿越 Java 之 Web基础篇 》系列文章
请参考:《穿越 Java 之 开发必备框架篇 》 系列文章
请阅读:《穿越 Java 之 SpringBoot》系列文章
请阅读:《穿越 Java 之 SpringCloud》 系列文章
需求
实现 user 服务 对 order 服务进行调用。使用OpenFeign+ NACOS+Ribbon 实现服务的注册与发现和负载均衡。
分析
-
1. 接下来就是选择 NACOS 进行服务的注册,可参考:NACOS服务注册
-
2. 然后需要选择OpenFeign组件 :他是一个HTTPclient的一个简单的调用方式。
可参考:GitHupz网址:https://github.com/OpenFeign/feign -
3. 写一个要调用远端的接口和方法声明。
-
4. 使用接口调用方法
使用
User-service
目录结构
pom.xml 依赖
- 整合springcloud–>spring-cloud-dependencies
- 整合spring cloud alibaba–>spring-cloud-alibaba-dependencies
- 整合spring cloud netflix–>spring-cloud-netflix-dependencies
- 整合openfeign --> spring-cloud-starter-openfeign
- 其实openfeign 自己已经整合了ribbon。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--为项目 整合openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--为项目 整合nacos-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<!--为项目整合spring cloud-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--为项目整合spring cloud alibaba-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.9.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--为项目整合spring cloud netflix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
application.yml配置文件
server:
port: 8096
#告诉我们的项目 nacos的地址是什么,方便注册localhost:8848
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
application:
name: order-service
编写OrderServiceFeignClient接口
package com.example.userservice.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "order-service")//order-service是服务名称
public interface OrderServiceFeignClient {
@GetMapping("/order/query")
public String query();
}
编写HelloController 类
- @Slf4j --> 日志的输出
- OrderServiceFeignClient–>自定义的实现类
package com.example.userservice.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
@RestController
@Slf4j
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "Hello Spring Cloud";
}
@Autowired
private OrderServiceFeignClient orderServiceFeignClient;
@GetMapping("/testFeign")
public String testFeign(){
return orderServiceFeignClient.query();
}
}
编写UserServiceApplication 启动类
- @EnableFeignClients -->引入FeignClient
package com.example.userservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableFeignClients
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
Order-service
目录结构
pom.xml 依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--为项目 整合nacos-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<!--为项目整合spring cloud-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--为项目整合spring cloud alibaba-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.9.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--为项目整合spring cloud netflix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
application.yml配置文件
server:
port: 8096
#告诉我们的项目 nacos的地址是什么,方便注册localhost:8848
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
application:
name: order-service
编写HelloController 类
package com.example.orderservice.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(path = {
"/order"},method = {
RequestMethod.GET})
@Slf4j
public class DemoController {
@GetMapping("/query")
public String demo(){
log.info("我被访问了!");
return "已查询出数据";
}
}
编写UserServiceApplication 启动类
package com.example.orderservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
测试
- 首先开启通过不同端口三个order服务1个user服务,以我的为例开启了8094,95,96的order服务和一个8090的用户服务。
- 访问:http://192.168.148.1:8848/nacos/
- 进入nacos界面可以看到注册进去的服务。
- 最后访问http://localhost:8090/testFeign测试调用
- 每个端口访问的次数不同