Cloud-Nacos服务治理-Feign服务调用

news/2024/7/26 10:31:58/文章来源:https://blog.csdn.net/tiantiantbtb/article/details/136549824

构建Cloud

父工程依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>cloud-demo2</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>common-api</module><module>user-service</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version><relativePath/></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR10</spring-cloud.version><mysql.version>8.0.27</mysql.version><mybatis.version>2.1.1</mybatis.version><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version><spring.cloud.alibaba>2.2.5.RELEASE</spring.cloud.alibaba></properties><dependencyManagement><dependencies><!-- springCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- springCloudAlibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba}</version><type>pom</type><scope>import</scope></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency></dependencies></project>
 构建公共模块

构建user-service(生产者)

依赖

  <dependencies><!--nacos客户端依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--Eureka客户端-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!--        </dependency>--><dependency><groupId>org.example</groupId><artifactId>common-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency></dependencies><build><finalName>userserver</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

启动类

@SpringBootApplication
@MapperScan("com.example.userservice.mapper")
//@MapperScan({"com.example.userservice.mapper", "com.example.anotherpackage.mapper"})
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
}

mapper

public interface UserMapper {@Select("select * from tb_user where id = #{id}")User findById(Long id);
}

service

public interface UserService {User queryById(Long id);
}

impl

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;public User queryById(Long id) {return userMapper.findById(id);}
}

controller

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;@Value("${server.port}")private String serverPort;@GetMapping("/serverport")public String serverport(){return serverPort;}@GetMapping("/{id}")public User queryById(@PathVariable("id") Long id) {User user = userService.queryById(id);user.setServerPort(serverPort);return user;}
}

application.yml

server:port: 8081
spring:application:name: user-servicedatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://xxxxxx:3306/cloud-user?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&useCursorFetch=trueusername: xxxxxpassword: xxxxxxx
#默认就是8848cloud:nacos:server-addr: localhost:8848#redis:#port: 6379#database: 0#password: 1111111111111#ssl: false#####################################################redis 集群环境配置#cluster:#  nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003#  commandTimeout: 5000
mybatis:type-aliases-package: com.example.userservice.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:com.example.userservice.mapper: debug
#eureka:
#  client:
#    #表示是否将自己注册进EurekaServer默认为true
#    register-with-eureka: true
#    #是否从EurekaServer抓取已有的注册信息默认true 单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
#    fetchRegistry: true
#    service-url:
#      defaultZone: http://localhost:7001/eureka
构建order-service(消费者)

依赖

 <dependencies><!--nacos客户端依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--Eureka客户端--><!--        <dependency>--><!--            <groupId>org.springframework.cloud</groupId>--><!--            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>--><!--        </dependency>--><dependency><groupId>org.example</groupId><artifactId>common-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency></dependencies><build><finalName>orderserver</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

启动类

@MapperScan("com.example.orderservice.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Bean@LoadBalanced//默认用的Ribbon的轮询策略public RestTemplate restTemplate(){return new RestTemplate();}//    @Bean
//    public IRule randomRule(){
//        return new RandomRule();
//    }}

mapper

public interface OrderMapper {@Select("select * from tb_order where id = #{id}")Order findById(Long id);
}

service

public interface OrderService {Order queryOrderById(Long orderId);
}

impl

@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.利用RestTemplate发起http请求,查询用户// 2.1.url路径String url = "http://user-service/user/" + order.getUserId();// 2.2.发送http请求,实现远程调用User user = restTemplate.getForObject(url, User.class);// 3.封装user到Orderorder.setUser(user);// 4.返回return order;}
}

 控制器

@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("{orderId}")public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {// 根据id查询订单并返回return orderService.queryOrderById(orderId);}
}

application.yml

server:port: 80
spring:application:name: order-servicedatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://xxxxxx:3306/cloud-order?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&useCursorFetch=trueusername: xxxxxpassword: xxxxxx
#默认就是8848cloud:nacos:server-addr: localhost:8848#redis:#port: 6379#database: 0#password: 1111111111111#ssl: false#####################################################redis 集群环境配置#cluster:#  nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003#  commandTimeout: 5000
mybatis:type-aliases-package: com.example.orderservice.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:com.example.userservice.mapper: debug
#将服务注册到Eureka
#eureka:
#  client:
#    #表示是否将自己注册进EurekaServer默认为true
#    register-with-eureka: true
#    #是否从EurekaServer抓取已有的注册信息默认true 单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
#    fetchRegistry: true
#    service-url:
#      defaultZone: http://localhost:7001/eureka# 全局配置
ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule# 特定服务配置
user-service:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

勾下  启动下  再去掉

Nacos安装

GitHub主页:GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - alibaba/nacosicon-default.png?t=N7T8https://github.com/alibaba/nacos

GitHub的Release下载页:Releases · alibaba/nacos · GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - Releases · alibaba/nacosicon-default.png?t=N7T8https://github.com/alibaba/nacos/releases

 此版本用例1.4.1

Release 1.4.1 (Jan 15, 2021) · alibaba/nacos · GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - Release 1.4.1 (Jan 15, 2021) · alibaba/nacosicon-default.png?t=N7T8https://github.com/alibaba/nacos/releases/tag/1.4.1

 

单机启动

startup.cmd -m standalone

http://localhost:8848/nacos/index.html

访问   localhost:8848/nacos/index.html     账密  nacos

这样Nacos服务端就启动了

Nacos服务注册

且一样有Ribbon的负载均衡

Nacos服务多级存储模型

点击详情

配置服务集群

例如:我想在将userservice 8081 配置称SH     将8082和8083配置成HZ

那么现在我希望orderserver访问HZ的集群

这样的话  orderService会不会默认先访问HZ的集群

发现并没有   还是3个都轮询访问  原因在于Ribbon

重启orderservice

发现只会访问8082和8083   而且是随机的  此时我将8082和8083两个服务停掉  就会访问8081  看样子集群配置是个优先的选项 但是当集群无法访问 会自动切换到跨集群

Nacos权重设置

默认都是1   随机访问   可以在0到1之间设置

如果我将8083设置成0.1

因为现在消费者也是HZ集群

明显现在调用   大部分都是8082    

如果设置成0 那么就不会被访问   有什么好处呢??比如服务器维护   nice

Nacos环境隔离

Nacos的服务存储和数据存储的最外层namespace

namespace-->group--->服务--->集群-->实例

下面新建个命名空间

如何将服务放到自定义的命名空间里   需要代码层面的配置

重启

那么这样会产生什么效果呢????

无法访问了  也就是说在不同的namespace下  无法访问  

Nacos的临时实例和非临时实例

临时实例采用心跳向Nacos汇报  挂了挂了会推送给消费者意思不健康了并且会马上剔除

非临时实例是Nacos主动询问    挂了会推送给消费者意思不健康了    不会剔除(除非你在Nacos管理页面手动删除)而是等待修复完成

如何注册非临时实例(默认都是临时实例)

Nacos统一配置管理

这里涉及一个Boot启动 读取配置文件的优先级问题  因为原先Nacos的配置是保存在application.yml中的,那么现在需要Nacos来管理配置文件, 那前提是不是需要知道Nacos配置的服务器地址在哪里,不知道怎么从nacos上读配置文件

如下图  因此建议将Nacos的配置放在bootstrao.yml中

引入Naocis配置管理客户端的依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

userService和orderService都引入

配置时注意缩进

我这里就把application.yml全部注释了

理论讲  bootstarp里配置的application可以删除     当然可以不删但别不一样   不然覆盖了

我这里整个注释了   就完全按Nacos上配置的来

Nacos配置热更新

Nacos配置共享

Feign调用

首先在调用方导入Feign依赖

启动类加上@EnableFeignClients

原先是通过restTemplate

下面用Feign的方式 声明feign调用接口

修改原先的调用方法    编程体验不佳......

Feign本身就集成了负载均衡功能  依赖中带了Ribbon

自定义Feign配置

主要是配置Feign调用日志级别

日志配置方式

这样配置没成功

用配置类   这个类上不要加@Configuration

 

Feign性能优化

Feign使用最佳实践

这种方式Spring官方不推荐 会造成紧耦合   API成面形成了紧耦合

也存在问题  就是会把用不到的也引入进来

方式二的实现

依赖

这也有点麻烦   要把实体类转掉   可以把feign-api和common模块合并

@Autowired
private UserClient userClient;

这个也肯定用不了了   那么就用@Bean  没试过  试试呗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_998659.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis实现分布式全局唯一id

目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1 使用 Redis 计数器实现2.2 使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1 导入依赖配置3.2 配置yml文件3.3 序列化配置3.4 编写获取工具3.5 测试获取工具 四、运行结果 一、前言 在很…

蓝桥杯练习题——归并排序

1.火柴排队 思路 1.求最小值的时候&#xff0c;可以直接按升序排序&#xff0c;这样得到的值就是最小值 2.求最小交换次数的时候&#xff0c;不能直接排序&#xff0c;因为只能交换相邻的数&#xff0c;只需要知道他们的相对大小&#xff0c;所以可以先用离散化&#xff0c;把…

百度地图城市点位数据下载并转换

概述 在浏览百度地图开放平台的时候&#xff0c;发现有个资源下载页面&#xff0c;里面有个城市中心点位和百度地图行政区划adcode映射表数据&#xff0c;这是一个经常使用到的数据&#xff0c;本文实现将这个数据转换为geojson&#xff0c;并借助QGIS转换为经纬度坐标或火星坐…

IDEA自带 .http 请求工具文档

基础语法 请求格式 基础格式 Method Request-URI HTTP-Version Header-field: Header-valueRequest-Body其中&#xff0c;GET 请求可以省略 Method 不写&#xff1b;HTTP-Version 可以省略不写&#xff0c;默认使用 1.1 版本。 示例&#xff1a; GET https://www.baidu.co…

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

docker的网络配置

文章目录 1、网络模式1.1、bridge模式(默认模式)1.2、host模式 2、bridge模式3、自定义网络 1、网络模式 Docker在创建容器时有四种网络模式&#xff1a;bridge/host/container/none&#xff0c;bridge为默认不需要用–net去指定&#xff0c;其他三种模式需要在创建容器时使用…

创邻科技获评环紫金港创新生态圈智源创新企业

3月1日&#xff0c;由杭州城西科创大走廊管理委员会指导&#xff0c;中共杭州市西湖区委员会、西湖区人民政府主办的“环紫金港创新生态圈”行动推进大会暨2024年紫金港科技城经济高质量发展大会在杭州举办。凭借重要的生态位置和创新业务成果&#xff0c;创邻科技受邀参会并被…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比&#xff0c;实在是太短暂了&#xff0c;大约相当于几分钟和一年的关系。人类已经走过的路&#xff0c;相比今后要走的漫漫长路&#xff0c;只能算是刚刚起步。如果跳出一个个具体事件&#xff0c;站在历史的高度去看&#xff0c;我们会发现…

Qt 简约又简单的加载动画 第七季 音量柱风格

今天和大家分享两个音量柱风格的加载动画,这次的加载动画的最大特点就是简单,只有几行代码. 效果如下: 一共三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc…

滴滴基于 Clickhouse 构建新一代日志存储系统

ClickHouse 是2016年开源的用于实时数据分析的一款高性能列式分布式数据库&#xff0c;支持向量化计算引擎、多核并行计算、高压缩比等功能&#xff0c;在分析型数据库中单表查询速度是最快的。2020年开始在滴滴内部大规模地推广和应用&#xff0c;服务网约车和日志检索等核心平…

#QT(智能家居界面-界面切换)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 &#xff08;1&#xff09;创建一个新界面&#xff08;UI界面&#xff09; &#xff08;2&#xff09;可以看到新加入一个ui文件&#xff0c;双击打开&#xff0c;设置窗口大小与登录界面一致 &#xff08;3&#xff09;加入几个PUS…

C++面向对象程序设计-北京大学-郭炜【课程笔记(五)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;五&#xff09;】 1、常量对象、常量成员函数1.1、常量对象1.2、常量成员函数1.3、常引用 2、友元&#xff08;friends&#xff09;2.1、友元函数2.2、友元类 3、运算符重载的基本概念3.1、运算符重载 4、赋值运算符的重…

Apache SeaTunnel 2.3.4 版本发布:功能升级,性能提升

​Apache SeaTunnel团队自豪地宣布2.3.4版本正式发布&#xff01;本次更新聚焦于增强核心功能&#xff0c;改善用户体验&#xff0c;并进一步优化文档质量。 此次版本发布带来了多项重要更新和功能增强&#xff0c;包括核心与API的修复、文档的全面优化、Catalog支持的引入&…

基于SSH的点餐服务管理系统的设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 开发工具相关技术 3 1.1 SSH框架 3 1.1.1 Spring 3 1.1.2 Spring MVC 3 1.1.3 Hibernate 4 1.2 前端技术 4 1.2.1 jQuery 5 1.2.2 Bootstrap 5 1.3 数据库技术 5 1.4 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 系统工作流程 8 2.3 用例…

js【详解】原型 vs 原型链

原型 每个 class 都有显示原型 prototype每个实例都有隐式原型_proto_实例的_proto_指向对应 class 的 prototype 如下范例&#xff1a; class Student 创建了 实例 xialuo 获取属性 xialuo.name 或执行方法 xialuo.sayhi()时&#xff0c;先在自身属性和方法寻找&#xff0…

灵魂指针,教给(二)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组…

包含字母数字及特殊字符 三种组合的正则两种写法

//长度8~16位&#xff1b;包含字母、数字及特殊字符 #$%^&*_-//正则1 写法&#xff1a;let reg_1 /^(?![A-Za-z0-9]$)^(?![A-Za-z#$\%^&*_\-]$)^(?![0-9#$\%^&_*\-]$)([A-Za-z0-9#$\%^&*_\-]{8,16})$///正则2 写法&#xff1a;let reg_2 /^(?![A-Za-z#$%…

CodeSys通过C函数接口调用Qt

建议先查看之前的文章【CodeSys中调用C语言写的动态库】&#xff0c;了解如何创建一个能够被codesys调用的动态库。 假如想要在函数中使用Qt或者第三方库&#xff08;比如opencv等&#xff09;&#xff0c;可以在其自动生成的makefile文件中设置好相应的参数。 比如我这里就是…

(十六)【Jmeter】取样器(Sampler)之测试活动(Test Action)

简述 操作路径如下: JMeter中的测试活动取样器实际上并不是一个具体的取样器类型,而是一种对测试计划中的多个取样器进行组合和执行的活动。常常被用作定时器,在某个请求之后等待多长时间。 参数说明 Logical Action on Thread(在线程上的逻辑操作) Pause Duration(mil…

Python爬虫——Scrapy-1

目录 简介 安装 基本使用 1. 创建爬虫的项目 2. 创建爬虫文件 3. 运行爬虫代码 scrapy项目组成 scrapy工作原理 ​编辑 58同城 scrapy架构组成 汽车之家 总结 简介 Scrapy 是一个基于 Python 的开源网络爬虫框架&#xff0c;它可以帮助开发者快速、高效地构…