Java学习Day60:微服务总结!(有经处无火,无火处无经)

1、技术版本

jdk:17及以上

-如果JDK8

springboot:3.1及其以上

-版本2.x

springFramWork:6.0及其以上

-版本5.x

springCloud:2022.0.5

-版本格林威治或者休斯顿

2、模拟springcloud

父模块指定父pom

<parent><groupId>org.springframework.boot</groupId><version>3.1.0</version><artifactId>spring-boot-starter-parent</artifactId>
</parent>

配置provider的application.yml

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db2username: rootpassword: 123456application:name: providerServer
mybatis:type-aliases-package: com.home.pojoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplserver:port: 8088

provider实现controller层,services层,和Mapper层,pojo

provider的pom

<properties><spring-cloud.version>2022.0.5</spring-cloud.version>
<properties>spring-boot-starter-web
mysql-connector-j
lombok
mybatis-spring-boot-starter
mybatis-plus-spring-boot3-starter<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

consumr层只用实现controller层和pojo

consumer的application.yml

server:port: 8080
spring:application:name: consumer

pom

<properties><spring-cloud.version>2022.0.5</spring-cloud.version>
<properties>spring-boot-starter-web
lombok<!--SpringCloud,BOM,依赖清单导入,所有依赖管理的坐标--><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

consumer调用provider的方法

usersss userssses= restTemplate.getForObject("http://localhost:8088/user/findAll",usersss.class);
return userssses;

访问consumer即可调用provider的方法

思考:

1.硬URL的端口号(端口变化,服务宕机

2.负载均衡无法实现

3.无返回信息

4.优化RestTemplate

5.多服务权限拦截如何实现?怎么保证所有微服务服务的安全性?

6.优化众多微服务的配置文件

3.注册中心eureka

Eureka服务器:

pom

<properties><spring-cloud.version>2022.0.5</spring-cloud.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><modelVersion>4.0.0</modelVersion><artifactId>eureka_server</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

application.yml

#启动服务器端口
server:port: 8761
#应用程序名字
spring:application:name: eurekaServer
#EurekaServer的地址,现在是自己的地址,如果是集群,需要写其它Server的地址。
eureka:client:fetch-registry: falseregister-with-eureka: falseservice-url:defaultZone: http://127.0.0.1:8761/eureka

启动类中标志:@EnableEurekaServer

@SpringBootApplication
@EnableEurekaServer
public class springBootEurekaServer {public static void main(String[] args) {SpringApplication.run(springBootEurekaServer.class,args);}
}

Eureka服务端组件:

在服务提供者provider_service工程中添加Eureka客户端依赖

<!--eureka客户端starter--><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies><!--SpringCloud,BOM,依赖清单导入,所有依赖管理的坐标--><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

在启动类上开启Eureka客户端发现功能@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient // 开启Eureka客户端发现功能
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class,args);}
}

注册到注册中心

修改配置文件:spring.application.name指定应用名称,作为服务ID使用

server:port: 8088
#配置eureka注册中心的地址
# 注册中心地址
eureka:client:service-url:defaultZone: http://127.0.0.1:8761/eureka
# 租约续约间隔时间,默认30秒eureka:instance:lease-renewal-interval-in-seconds: 30

Eureka客户端组件

在服务消费者consumer_service工程中添加Eureka客户端依赖

<!-- Eureka客户端 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--SpringCloud所有依赖管理的坐标-->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

注册到注册中心

# 注册中心地址
eureka:client:service-url:defaultZone: http://127.0.0.1:8761/eurekaregistry-fetch-interval-seconds: 30

在启动类开启Eureka客户端@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
public class springBootConsumerStarter {public static void main(String[] args) {SpringApplication.run(springBootConsumerStarter.class,args);}@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

配置完成后执行流程

  1. 通过注册中心客户端对象DiscoveryClient,获取Eureka中注册的user-service实例列表

  2. 获取user-service服务实例对象

  3. 从实例对象中获取host地址和端口,拼接请求地址

  4. 使用RestTemplate发送请求

public usersss findAll(){//discoveryClient 可以拉取注册中心中服务列表//getInstances(服务名),当前服务只有1个,返回值是List集合,获取0索引服务对象ServiceInstance instance = discoveryClient.getInstances("PROVIDERSERVER").get(0);//instance服务对象的实例。获取服务提供者的IP,端口号String host = instance.getHost();int port = instance.getPort();return restTemplate.getForObject("http://"+host+":"+port+"/user/findAll",usersss.class);}
}

4.Nacos

相比于erueka

Nacos消费者配置:
<properties><spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version><properties><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

配置Nacos注册中心地址

server:port: 8080
spring:application:name: consumerNacos
# 注册中心地址cloud:nacos:discovery:server-addr: 127.0.0.1:8848
Nacos服务端配置:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--SpringCloud,BOM,依赖清单导入,所有依赖管理的坐标--><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

application.yml不变

负载均衡:

在consumer中配置即可

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

在启动类配置

    @LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
问题:需要编写类似的大量重复代码,格式基本相同,无非参数不一样!

5.OpenFeign

Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,是以Java接口的方式发送Http请求,而不用像Java中通过封装HTTP请求url的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。

Feign被广泛应用在Spring Cloud 的解决方案中,是学习基于Spring Cloud 微服务架构不可或缺的重要组件。

需要导入:

        <!--伪装调用jar--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

启动引导类加@EnableFeignClients注解

@SpringBootApplication
@EnableFeignClients
public class SpringBootFeignConStart {public static void main(String[] args) {SpringApplication.run(SpringBootFeignConStart.class,args);}
}

编写FeignClient接口,使用SpringMVC的注解

@FeignClient("providerUser")
public interface FeignUserService {@RequestMapping("feign/eignQueryUserById")User feignQueryUserById(@RequestParam("id") Integer id);
}

在Controller中注入Feign接口,直接调用,无需实现类,但是GetMaping的Restful风格必去和调用provider的方法相同且传参方式也相同!!!

访问接口测试!

支持熔断(服务降级)、配置日志级别、请求压缩和响应压缩

6.网关GateWay

所有微服务的统一入口。Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

  • Route(路由):这是网关的基本模块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。

  • Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。

  • Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

创建SpringBoot工程gateway_server

  <!--引入网关的jar包,不能引web jar包--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.7.0</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

application.yml

定义端口号,名称,注册到nacos

这是为当前路由规则指定一个 唯一的标识符

  • lb:// 是 负载均衡(Load Balancer)的前缀,意味着请求将通过负载均衡机制路由到一个注册在 Eureka、Consul 或其他注册中心的服务。
  • consumerOpenFeign 是服务的名称,这个名称需要与注册中心中服务的名称一致。Spring Cloud Gateway 会从服务注册中心获取该服务的实际地址(例如:http://consumerOpenFeign:8080),并且通过负载均衡器将请求转发到该服务。

predicates 用于定义请求的 匹配条件,即哪些请求应该由当前的路由规则来处理。在这个例子中,使用了 Path=/**,表示匹配所有的路径。

过滤器隐藏usertwo,访问时不用书写,避免接口地址暴露

server:port: 80
spring:application:name: gatewaycloud:nacos:server-addr: 127.0.0.1:8848#配置网关gateway:routes:- id: orderService  #自定义路由的唯一标识符uri: lb://consumerOpenFeign  #服务名字,从注册中心通过服务名称来获取接口predicates:- Path=/**  #拦截浏览器的请求地址filters:- PrefixPath=/usertwo
自定义全局过滤器【重点】

token:登录成功后,根据登录用户名等(用户ID),生成一个属于这个用户自己的密钥,就称为Token。下次用户访问的时候,带着Token来请求服务器。拿Token值反解析出用户数据来(无论是解析失败,还是根本就没有Token)拦截器不能放行。登录成功的时候,产生一个加密后字符串:Token响应回浏览器的响应头。浏览器再次请求的时候,携带Token来访问服务器,Token会放在浏览器的请求头中。

大部分都是异步请求,axios拦截器

响应的时候,获取响应头中的token值。请求的时候,在请求头中添加token值。

token值存储在浏览器的缓存中,缓存对象 localStorage, setItem存储键值对,getItem传递键获取值

nacos注册和配置中心

nacos单独组件,启动就可以了,默认端口8848

微服务配置nacos注册中心的地址

spring:cloud:nacos:server-addr: 127.0.0.1:8848
sentinel流量防卫兵
        <!--熔断的支持--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId></dependency><!--配置哨兵--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

配置文件

server:port: 8080
spring:application:name: consumerOpenFeigncloud:#哨兵sentinel:transport:dashboard: 127.0.0.1:8086nacos:server-addr: 127.0.0.1:8848openfeign:#feign熔断支持circuitbreaker:enabled: true

在方法上定义哨兵

    @GetMapping("/selectusertwo")@SentinelResource(value = "selectusertwo",fallback ="selectusertwoFallBack",blockHandler = "selectusertwoHandler")public usersss selectusertwo(@RequestParam("id") Integer id){if (id<4){throw new RuntimeException("请输入正确ID!");}return userServicesTwo.selectusertwo(id);}

fallback:限流

blockHandler:熔断

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

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

相关文章

ThreadX在STM32上的移植:F1,F4通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中&#xff0c;实时操作系统&#xff08;RTOS&#xff09;的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS&#xff0c;它以其小巧、快速和可靠而闻名。在本文中&#xff0c;我们将探讨如何将ThreadX移植到STM32微控制器上&#xff0c;特别是…

UE5.4 PCG基础节点

Projection&#xff1a;投影。可以让撒点重新恢复到表面采样器的初始高度和旋转值。缩放保持不变 DensityFilter&#xff1a;密度过滤器 AttributeNoise&#xff1a;Attribute噪声 模式&#xff1a;设置。重新定义噪点分布为0-1 模式&#xff1a;加0或乘1的时候&#xff0…

STM32-PWR低功耗

一、概述 PWR&#xff08;Power Control&#xff09;电源控制&#xff0c;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能可编程电压监测&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上…

AI 证件照工具 HivisionIDPhotos

如何在 Linux 系统使用 Docker 在本地部署 HivisionIDPhotos&#xff0c;并结合路由侠内网穿透外网访问本地部署的 HivisionIDPhotos 。 第一步&#xff0c;本地部署安装 HivisionIDPhotos 1&#xff0c;检查 Docker 服务状态&#xff0c;确保 Docker 正常运行。 systemctl …

springboot - 定时任务

定时任务是企业级应用中的常见操作 定时任务是企业级开发中必不可少的组成部分&#xff0c;诸如长周期业务数据的计算&#xff0c;例如年度报表&#xff0c;诸如系统脏数据的处理&#xff0c;再比如系统性能监控报告&#xff0c;还有抢购类活动的商品上架&#xff0c;这些都离不…

pandas——对齐运算+函数应用

引言&#xff1a;对齐运算是数据清洗的重要过程&#xff0c;可以按索引对齐进行运算&#xff0c;如果没对齐的位置则补NaN&#xff0c;最后也可以填充NaN 一、Series的对齐运算 1.Series 按行、索引对齐 import pandas as pds1 pd.Series(range(10, 20), indexrange(10)) s2…

画动态爱心(Python-matplotlib)

介绍 氵而已 由于用的是 AI&#xff0c;注释得非常清楚&#xff0c;自己改改也可以用 代码 # -*- coding: utf-8 -*- # Environment PyCharm # File_name 尝试1 |User Pfolg # 2024/11/05 22:45 import numpy as np import matplotlib.pyplot as plt import matplot…

学习threejs,将多个网格合并成一个网格

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Geometry 几何体1.2 …

对于一个需要渲染300帧的动画项目,云渲染要多久

探讨云渲染动画300帧需要多久的问题时&#xff0c;我们今天来从多个角度进行分析&#xff0c;对于一个需要渲染300帧的动画项目&#xff0c;传统的本地渲染方式可能会因为硬件限制而变得耗时且效率低下。幸运的是&#xff0c;【渲染101】云渲染技术的出现为这一问题提供了解决方…

系统上云-流量分析和链路分析

优质博文&#xff1a;IT-BLOG-CN 一、流量分析 【1】流量组成&#xff1a; 按协议划分&#xff0c;流量链路可分为HTTP、SOTP、QUIC三类。 HTTPSOTPQUIC场景所有HTTP请求&#xff0c;无固定场景国内外APP等海外APP端链路选择DNS/CDN(当前特指Akamai)APP端保底IP列表/动态IP下…

「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas 组件的动态进阶应用

在鸿蒙应用中&#xff0c;Canvas 组件可以实现丰富的动态效果&#xff0c;适合用于动画和实时更新的场景。本篇将介绍如何在 Canvas 中实现动画循环、动态进度条、旋转和缩放动画&#xff0c;以及性能优化策略。 关键词 Canvas 组件动态绘制动画效果动态进度条旋转和缩放性能优…

C 学习(4)

return 0; 前提&#xff1a;C 语言规定&#xff0c;main()是程序的入口函数&#xff0c;即所有的程序一定要包含一个main()函数。程序总是从这个函数开始执行&#xff0c;如果没有该函数&#xff0c;程序就无法启动。其他函数都是通过它引入程序的。 main()的写法&#xff0c…

Springboot3.3 + Mybatis / Mybatis-plus

Java17, Springboot 3.3.5, 项目一启动就报错&#xff1a; Invalid value type for attribute factoryBeanObjectType: java.lang.String 我知道问题出现在pom依赖的版本上。但网上对于Springboot3.3的配置资料并不多&#xff0c;且在我代码上实测还是会报错。搞了一天终于…

高亚科技签约酸动力,助力研发管理数字化升级

近日&#xff0c;中国企业管理软件资深服务商高亚科技与广东酸动力生物科技有限公司&#xff08;以下简称“酸动力”&#xff09;正式签署合作协议。借助高亚科技的8Manage PM项目管理软件&#xff0c;酸动力将进一步优化项目过程跟踪与节点监控&#xff0c;提升研发成果的高效…

java多线程编程(二)一一>线程安全问题, 单例模式, 解决程线程安全问题的措施

引言&#xff1a; 如果多线程环境下代码运行的结果是符合我们预期的&#xff0c;即在单线程环境应该的结果&#xff0c;则说这个程序是线程安全的 线程安全问题的原因&#xff1a; 一.操作系统的随机调度 &#xff1a; 二.多个线程修改同一个变量&#xff1a; 三.修改操作不是…

推荐一款非常好用的视频编辑软件:Movavi Video Editor Plus

MovaviVideoEditorPlus(视频编辑软件)可以制作令人惊叹的视频&#xff0c;即使您没有任何视频编辑方面的经验! 该款视频编辑程序没有复杂的设置&#xff0c;只需进行直观的拖放控制。在您的电脑上免费使用MovaviVideoEditor亲身体验它的简单易用性与强大功能! 基本简介 您是否…

【算法】递归+深搜+哈希表:889.根据前序和后序遍历构造二叉树

目录 1、题目链接 相似题目: 2、题目 ​3、解法&#xff08;针对无重复值&#xff0c;哈希表递归&#xff09; 函数头-----找出重复子问题 函数体---解决子问题 4、代码 1、题目链接 889.根据前序和后序遍历构造二叉树&#xff08;LeetCode&#xff09; 相似题目: 105.…

高级信号完整性

高级信号完整性&#xff0c;2022年版&#xff0c;1473页&#xff0c;24h秒发 内容庞大&#xff0c;都是新的内容、架构 QS排名100内的美国高校课件 发货内容&#xff1a; 29个分章节PDF 1个汇总PDF&#xff0c;1473页 点击获取 课程首先对电磁学进行了回顾。随后&#xff0c;…

yelp数据集上识别潜在的热门商家

yelp数据集是研究B2C业态的一个很好的数据集&#xff0c;要识别潜在的热门商家是一个多维度的分析过程&#xff0c;涉及用户行为、商家特征和社区结构等多个因素。从yelp数据集里我们可以挖掘到下面信息有助于识别热门商家 用户评分和评论分析 评分均值: 商家的平均评分是反映其…

qt QDataStream详解

1. 概述 QDataStream是Qt框架中的一个核心类&#xff0c;主要用于处理二进制数据的序列化和反序列化。它提供了高效、跨平台的方式&#xff0c;将C数据结构转化为字节流&#xff0c;便于在网络传输、持久化存储等场景下使用。QDataStream可以处理包括整数、浮点数、布尔值、字…