当前位置: 代码迷 >> 综合 >> 穿越Java - SpringCloud篇 第三章 Spring Cloud OpenFeign | 第2节 OpenFeign+NACOS实现服务的注册与发现和负载均衡
  详细解决方案

穿越Java - SpringCloud篇 第三章 Spring Cloud OpenFeign | 第2节 OpenFeign+NACOS实现服务的注册与发现和负载均衡

热度:83   发布时间:2024-03-09 06:15:26.0

OpenFeign+NACOS实现服务的注册与发现和负载均衡

    • 开发环境
    • 更多干货
    • 需求
    • 分析
    • 使用
      • User-service
        • 目录结构
        • pom.xml 依赖
        • application.yml配置文件
        • 编写OrderServiceFeignClient接口
        • 编写HelloController 类
        • 编写UserServiceApplication 启动类
      • Order-service
        • 目录结构
        • pom.xml 依赖
        • application.yml配置文件
        • 编写HelloController 类
        • 编写UserServiceApplication 启动类
    • 测试

开发环境

基于:IntelliJ IDEAMaven构建工具JDK1.8SpringBoot 2.3.4Spring4.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:8848application: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";}@Autowiredprivate 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:8848application: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测试调用
    在这里插入图片描述
  • 每个端口访问的次数不同
    在这里插入图片描述
  相关解决方案