热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

穿越JavaSpringCloud篇第一章负载均衡Ribbon|第2节RestTemplate+NACOS+Ribbon实现服务的注册与发现和负载均衡。

RestTemplateNACOSRibbon实现服务的注册与发现和负载均衡开发环境更多干货需求分析使用User-service目录结构pom.xml依赖application.y


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

    • 开发环境
    • 更多干货
    • 需求
    • 分析
    • 使用
      • User-service
        • 目录结构
        • pom.xml 依赖
        • application.yml配置文件
        • 编写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 服务进行调用。使用RestTemplate+ NACOS+Ribbon 实现服务的注册与发现和负载均衡。


分析


  • 在springcloud 要考虑的是:user要想调用order 必须要知道 它的一个IP 端口 路径进行调用.

  • 但是存在一个问题就是 假如还有其他的模块 就会再维护一份url地址 ,干很多重复的工作。如下图:在这里插入图片描述

  • 所以在微服务的场景下我们要先去考虑服务的注册与发现,如下图:
    在这里插入图片描述

  • 接下来就是选择 NACOS 进行服务的注册,可参考NACOS服务注册

  • 然后选择Ribbon 提供的功能是:【服务发现+负载均衡】

需要用到:OpenFeign组件
GitHupz网址:https://github.com/OpenFeign/feign


使用


User-service


目录结构


  • 在这里插入图片描述

pom.xml 依赖


  • 整合springcloud–>spring-cloud-dependencies
  • 整合spring cloud alibaba–>spring-cloud-alibaba-dependencies
  • 整合spring cloud netflix–>spring-cloud-netflix-dependencies
  • 整合ribbon --> spring-cloud-starter-netflix-ribbon

<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.3.4.RELEASEversion><relativePath/> parent><groupId>com.examplegroupId><artifactId>user-serviceartifactId><version>0.0.1-SNAPSHOTversion><name>user-servicename><description>Demo project for Spring Bootdescription><properties><java.version>1.8java.version>properties><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><optional>trueoptional>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-netflix-ribbonartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>dependency>dependencies>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-dependenciesartifactId><version>Greenwich.SR3version><type>pomtype><scope>importscope>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-alibaba-dependenciesartifactId><version>0.9.0.RELEASEversion><type>pomtype><scope>importscope>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-netflix-dependenciesartifactId><version>2.1.3.RELEASEversion><type>pomtype><scope>importscope>dependency>dependencies>dependencyManagement>

application.yml配置文件


server:port: 8096
#告诉我们的项目 nacos的地址是什么&#xff0c;方便注册localhost:8848
spring:cloud:nacos:discovery:server-addr: localhost:8848application:name: order-service

编写HelloController 类


  • &#64;Slf4j --> 日志的输出
  • RestTemplate -->可以访问远程Http服务

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;&#64;RestController
&#64;Slf4j
public class HelloController {&#64;GetMapping("/hello")public String hello(){return "Hello Spring Cloud";}&#64;Autowiredprivate RestTemplate restTemplate;&#64;GetMapping("/test2")public String test2(){//Ribbon会根据order-service名称做服务发现和负载均衡-->url192.168.0.3:return this.restTemplate.getForObject("http://order-service/order/query",String.class);}
}

编写UserServiceApplication 启动类


  • 注册了一个Bean -->RestTemplate

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.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
&#64;SpringBootApplication
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}&#64;Bean&#64;LoadBalanced//此注解相当于为restTemplate整合了Ribbon的功能public RestTemplate restTemplate(){return new RestTemplate();}
}

Order-service


目录结构


  • 在这里插入图片描述

pom.xml 依赖

<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.3.4.RELEASEversion><relativePath/> parent><groupId>com.examplegroupId><artifactId>user-serviceartifactId><version>0.0.1-SNAPSHOTversion><name>user-servicename><description>Demo project for Spring Bootdescription><properties><java.version>1.8java.version>properties><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><optional>trueoptional>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>dependency>dependencies>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-dependenciesartifactId><version>Greenwich.SR3version><type>pomtype><scope>importscope>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-alibaba-dependenciesartifactId><version>0.9.0.RELEASEversion><type>pomtype><scope>importscope>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-netflix-dependenciesartifactId><version>2.1.3.RELEASEversion><type>pomtype><scope>importscope>dependency>dependencies>dependencyManagement>

application.yml配置文件

server:port: 8096
#告诉我们的项目 nacos的地址是什么&#xff0c;方便注册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;
&#64;RestController
&#64;RequestMapping(path &#61; {"/order"},method &#61; {RequestMethod.GET})
&#64;Slf4j
public class DemoController {&#64;GetMapping("/query")public String demo(){log.info("我被访问了&#xff01;");return "已查询出数据";}
}

编写UserServiceApplication 启动类

package com.example.orderservice;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;&#64;SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}

测试


  • 首先开启通过不同端口三个order服务1个user服务&#xff0c;以我的为例开启了8094,95,96的order服务和一个8090的用户服务。
    在这里插入图片描述
  • 访问&#xff1a;http://192.168.148.1:8848/nacos/
  • 进入nacos界面可以看到注册进去的服务。
    在这里插入图片描述
  • 最后访问http://localhost:8090/test2测试调用
    在这里插入图片描述
  • 每个端口访问的次数不同
    在这里插入图片描述

推荐阅读
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 探讨低代码行业发展现状,分析其未能催生大型企业的原因,包括市场需求、技术局限及商业模型等方面。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • 检查 Kubernetes 系统命名空间中的 Pod 状态时,发现 Metric Server Pod 虽然处于运行状态,但存在异常:日志显示 'it doesn’t contain any IP SANs'。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
author-avatar
妈妈的话CPC-8_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有