《Spring Guides系列学习》guide61 - guide65

news2024/11/27 8:26:31

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。

在这里插入图片描述
接着上篇看过的guide60,接着往下看。

guide61、Vault Configuration

简单就是启动 Vault,将配置属性存储在 Vault 中,构建 Spring 应用程序并将其与 Vault 连接。

首先是安装和启动vault,这边直接启动

在这里插入图片描述

Vault 是一个数据管理系统,允许您存储静态加密的敏感数据。

它非常适合存储敏感的配置详细信息,例如密码、加密密钥、API 密钥。

设置两个环境变量以将 Vault CLI 指向 Vault 端点并提供身份验证令牌。并在Vault 中存储配置键值对

在这里插入图片描述

定义配置类:

@ConfigurationProperties("example")
public class MyConfiguration {
  private String username;
  private String password;
  ... ...

@ConfigurationProperties是一个Spring Boot注解,用于将外部配置属性绑定到Java Bean中。通过在Java Bean的属性上添加@ConfigurationProperties注解,Spring Boot将自动加载配置文件中的属性值,并将其绑定到Java Bean中。这样,我们就可以像访问Java Bean的其他属性一样访问外部配置属性。@ConfigurationProperties注解还支持类型安全的属性绑定,可以自动转换属性值的类型。

@ConfigurationProperties(“example”)注解表示将外部配置属性绑定到一个名为"example"的Java Bean中。这意味着Spring Boot将尝试加载以"example"为前缀的所有属性,并将它们绑定到该Java Bean中。


配置应用程序参数:

spring.application.name=gs-vault-config
spring.cloud.vault.token=00000000-0000-0000-0000-000000000000
spring.cloud.vault.scheme=http
spring.cloud.vault.kv.enabled=true
spring.config.import:  vault://

允许从Vault导入配置。最后创建一个启动类:

@SpringBootApplication
@EnableConfigurationProperties(MyConfiguration.class)public class Application implements CommandLineRunner {
  private final MyConfiguration configuration;
  public Application(MyConfiguration configuration) {
    this.configuration = configuration;
  }

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(String... args) {
    Logger logger = LoggerFactory.getLogger(Application.class);
    logger.info("----------------------------------------");
    logger.info("Configuration properties");
    logger.info("   example.username is {}", configuration.getUsername());
    logger.info("   example.password is {}", configuration.getPassword());
    logger.info("----------------------------------------");
  }}

启动结果:
在这里插入图片描述


guide62、Deploying a Spring Boot app to Azure

Azure Spring Apps是一个在Azure云上运行Spring Boot应用程序的托管服务,由Microsoft Azure和VMware合作推出。Azure Spring Apps提供了一个全面的解决方案,帮助开发人员将Spring Boot应用程序轻松部署到Azure云上,并提供一系列功能和工具来监视、保护和扩展应用程序。Azure Spring Apps支持多种应用程序类型,包括Java Web应用程序、REST API、事件驱动的微服务和批处理作业等。它还支持多种数据库和消息传递服务,如MySQL、PostgreSQL、Redis和RabbitMQ等。Azure Spring Apps还提供了与Azure DevOps、GitHub和Jenkins等持续集成/持续交付工具的集成,以便快速、可靠地构建和部署Spring Boot应用程序。

仅了解。

guide63、Client-Side Load-Balancing with Spring Cloud LoadBalancer

构建一个微服务应用程序,该应用程序使用 Spring Cloud LoadBalancer 在对另一个微服务的调用中提供客户端负载平衡。
本guide要构建两个微服务,首先创建一个顶层父项目,再去分别创建sayHello和user两个微服务。

1、其中sayHello服务中导入spring web依赖,并且提供服务:

@RestController
@SpringBootApplication
public class SayHelloApplication {

  private static Logger log = LoggerFactory.getLogger(SayHelloApplication.class);

  public static void main(String[] args) {
    SpringApplication.run(SayHelloApplication.class, args);
  }

  @GetMapping("/greeting")
  public String greet() {
  log.info("Access /greeting");

  List<String> greetings = Arrays.asList("Hi there", "Greetings", "Salutations");
  Random rand = new Random();

  int randomNum = rand.nextInt(greetings.size());
  return greetings.get(randomNum);
  }

  @GetMapping("/")
  public String home() {
  log.info("Access /");
  return "Hi!";
  }
}

比较简单,就是提供一个端点,返回随机问候语(从三个静态列表中挑选出来)。

并且在配置文件里配置参数, 因为要测试负载均衡,所以根据不同port,启动3个服务实例:

spring.application.name=say-hello
server.port=8090/9092/9999

2、再创建客户端服务user

@SpringBootApplication
@RestController
public class UserApplication {

  private final WebClient.Builder loadBalancedWebClientBuilder;
  private final ReactorLoadBalancerExchangeFilterFunction lbFunction;

  public UserApplication(WebClient.Builder webClientBuilder,
      ReactorLoadBalancerExchangeFilterFunction lbFunction) {
    this.loadBalancedWebClientBuilder = webClientBuilder;
    this.lbFunction = lbFunction;
  }

  public static void main(String[] args) {
    SpringApplication.run(UserApplication.class, args);
  }

  @RequestMapping("/hi")
  public Mono<String> hi(@RequestParam(value = "name", defaultValue = "Mary") String name) {
    return loadBalancedWebClientBuilder.build().get().uri("http://say-hello/greeting")
        .retrieve().bodyToMono(String.class)
        .map(greeting -> String.format("%s, %s!", greeting, name));
  }

  @RequestMapping("/hello")
  public Mono<String> hello(@RequestParam(value = "name", defaultValue = "John") String name) {
    return WebClient.builder()
        .filter(lbFunction)
        .build().get().uri("http://say-hello/greeting")
        .retrieve().bodyToMono(String.class)
        .map(greeting -> String.format("%s, %s!", greeting, name));
  }
}

在user提供的端口中可以看到,会访问服务端接口来返回greeting。

配置提供了一个@LoadBalanced WebClient.Builder实例,在命中端点/hi时,使用此构建器创建一个WebClient实例,该实例GET向Say Hello服务的 URL 发出 HTTP 请求并将结果作为String.

在UserApplication.java,我们还添加了一个/hello执行相同操作的端点。但是,我们不使用@LoadBalanced注释,而是使用@Autowired负载平衡器交换过滤器函数 ( lbFunction),我们通过使用该filter()方法将其传递给WebClient我们以编程方式构建的实例。

尽管为两个端点设置的负载均衡实例略有不同,但两者的最终行为完全相同。Spring Cloud LoadBalancer 用于选择合适的Say Hello服务实例。

还需要一个@Configuration类来设置负载均衡WebClient.Builder实例。

@Configuration
@LoadBalancerClient(name = "say-hello", configuration = SayHelloConfiguration.class)
public class WebClientConfig {  
    @loadBalanced  
    @Bean  
    WebClient.Builder webClientBuilder() {    
    return WebClient.builder();  
}}

@LoadBalanced 是 Spring Cloud 提供的一个注解,用于开启客户端负载均衡功能。当使用 @LoadBalanced 注解修饰 RestTemplate、WebClient 等客户端组件时,它会自动将请求负载均衡到多个服务实例中。

@LoadBalancerClient 是 Spring Cloud 提供的一个注解,用于配置客户端负载均衡器的行为。它可以指定需要进行负载均衡的服务名称,以及负载均衡的配置类。本例中它会自动将请求负载均衡到名为 “say-hello” 的服务实例中,并根据 SayHelloConfiguration 中的配置进行负载均衡。

在WebClientConfig.java中,使用@LoadBalancerClient注释来传递自定义 LoadBalancer 配置。

@LoadBalancerClient(name = "say-hello", configuration = SayHelloConfiguration.class)

这意味着,每当访问服务时,Spring Cloud LoadBalancer 不会使用默认设置运行,而是使用SayHelloConfiguration.java中提供的配置。

public class SayHelloConfiguration {

  @Bean
  @Primary
  ServiceInstanceListSupplier serviceInstanceListSupplier() {
    return new DemoServiceInstanceListSuppler("say-hello");
  }
}

class DemoServiceInstanceListSuppler implements ServiceInstanceListSupplier {
  private final String serviceId;
  DemoServiceInstanceListSuppler(String serviceId) {
    this.serviceId = serviceId;
  }
  @Override
  public String getServiceId() {
    return serviceId;
  }
  @Override
  public Flux<List<ServiceInstance>> get() {
    return Flux.just(Arrays
        .asList(new DefaultServiceInstance(serviceId + "1", serviceId, "localhost", 8090, false),
            new DefaultServiceInstance(serviceId + "2", serviceId, "localhost", 9092, false),
            new DefaultServiceInstance(serviceId + "3", serviceId, "localhost", 9999, false)));
  }
}

在这个类里实现了ServiceInstanceListSupplier,并且还提供了3个硬编码实例,serviceId传入的是say-hello。

测试,直接访问接口:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


guide64、Spring Cloud Data Flow

Spring Cloud Data Flow 是一个用于构建和管理数据流管道的开源工具。它是 Spring Cloud
生态系统中的一个子项目,旨在简化数据处理和分析的开发和部署流程。

Spring Cloud Data Flow 提供了一组可视化的工具和
API,用于构建、部署和管理数据流应用程序。用户可以通过简单的拖放操作,将各种数据处理组件(例如消息队列、数据库、分析工具等)组合成一个完整的数据流管道,并将其部署到云端或本地集群中。

Spring Cloud Data Flow
还提供了一组强大的监控和管理工具,用于实时监控数据流管道的运行状态,以及进行故障排查和性能优化。

Spring Cloud Data Flow 支持多种数据处理框架,例如 Spring Cloud Stream、Spring Cloud
Task、Apache Spark、Apache Kafka 等等。它还提供了丰富的扩展点,方便用户自定义数据处理组件和管道流程。

总之,Spring Cloud Data Flow 是一个强大的数据流处理工具,可以帮助用户快速构建和管理高效、可靠的数据流管道。

仅了解。


guide65、Spring Boot Kubernetes

Kubernetes(简称 K8s)是一个开源的容器编排和管理平台。

Kubernetes 可以自动化容器的部署、扩展、管理和故障恢复等操作,使得在容器化的环境中运行应用程序更加简单和高效。Kubernetes
支持多种容器运行时,例如 Docker、rkt 等,可以运行在各种云计算平台上,例如 Amazon Web Services、Microsoft Azure、Google Cloud Platform 等等。

Kubernetes 还提供了丰富的 API 和命令行工具,用于管理和操作容器集群。它支持多种部署和扩展方式,包括手动部署、自动扩展、滚动升级等等。同时,Kubernetes 也提供了一组强大的监控和调试工具,方便用户进行故障排查和性能优化。

扩展阅读:https://worktile.com/kb/ask/20048.html

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

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

相关文章

mybatisplus递归传递多个参数 | mybatisplus传递多个参数获取层级数据 | mybatisplus传递多个参数获取树形数据

搜索关键字&#xff1a; mybatisplus关联查询传递参数|"select""树形结构"|"select""树形结构""传参"| "select""many""传参"| "select""column""传参" 1、…

chatgpt赋能python:用Python自动操作其他软件优化你的SEO

用Python自动操作其他软件优化你的SEO 作为一名有着10年Python编程经验的工程师&#xff0c;我了解到Python具有强大的自动化功能&#xff0c;可以帮助我们自动化执行任务&#xff0c;节省时间和精力。其中&#xff0c;自动操作其他软件应用案例极为常见&#xff0c;如此&…

C#自定义控件:提示未将对象引用设置到对象实例

一、概述 1、当自定义的控件在添加的时候提示&#xff1a;提示未将对象引用设置到对象实例&#xff1b;如下所示&#xff1a; 2、添加上的自定义控件提示&#xff1a;未将对象引用设置到对象实例&#xff1b;如下所示&#xff1a; 二、问题分析 分析1&#xff1a; 在项目中使…

关于“烫烫烫烫烫烫烫”的程序员笑话

环境 Microsoft Visual Studio Community 2022Windows 11 家庭中文版 笑话 小明在超市买了3瓶汽水&#xff0c;他先打开第0瓶汽水&#xff0c;咕咚咕咚喝光了&#xff0c;接着打开第1瓶汽水&#xff0c;又咕咚咕咚喝光了&#xff0c;然后又打开第2瓶汽水&#xff0c;咕咚咕咚…

运维实用脚本整理

运维实用脚本整理 Linux运维日常巡检脚本系统指标巡检脚本日常命令性能相关的命令进程相关的命令javadump.sh 常用工具一键部署安装常用lib库安装系统检查脚本SPN 日常巡查脚本ffmpeg脚本打开进程&#xff0c;并判断进程数量关闭进程 java jar包启动-剔除Pom中依赖Java jar包通…

SAP QM 检验批上的‘容器数’

近期遇到一个问题。项目上质量部门发现某个原料批次收货打印出来的样品标签数不对。经查发现收货后触发的检验批上的‘容器数’&#xff08;No.Containers&#xff09;为999&#xff0c;实际上此次收货的箱数有1500多。 对于栏位‘容器数’&#xff0c;SAP的官方帮助文档&#…

指针 --- C语言

目录 1.指针是什么 2.指针和指针类型 3.野指针 4.指针运算 5.指针和数组 6.二级指针 7.指针数组 1.指针是什么 为了更好地管理内存&#xff0c;把内存分为了1个个小小的内存单元&#xff0c;大小是一个字节&#xff0c;每个字节给一个编号&#xff0c;内存的编号就是地…

《Spring Guides系列学习》guide56 - guide60

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

Entity Framework Core 简明教程(3)- 关系处理

在数据库层面&#xff0c;表之间关系&#xff0c;通过主键、外键来实现&#xff0c;基于约束 (constraint) 和数据完整性来制约。 在 EF Core 技术层面&#xff0c;并不是简单地与数据库这些关系和约束对应&#xff0c;EF Core 有它自己的机制。本篇介绍 EF core 在处理表关系方…

HTML+CSS实训——Day03——仿网易云音乐的发现页界面

仓库链接:https://github.com/MengFanjun020906/HTML_SX 一些今天需要用到的知识点 弹性盒子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedg…

二次元的登录界面

今天还是继续坚持写博客&#xff0c;然后今天给大家带来比较具有二次元风格的登录界面&#xff0c;也只是用html和css来写的&#xff0c;大家可以来看看&#xff01; 个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &…

[acwing周赛复盘] 第 105 场周赛20230527

[acwing周赛复盘] 第 105 场周赛20230527 总结5029. 极值数量1. 题目描述2. 思路分析3. 代码实现 5030. 核心元素1. 题目描述2. 思路分析3. 代码实现 5031. 矩阵扩张1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是笨比的一周&#xff0c;只做出1题。T1 模拟T2 计…

leetcode刷题之链表相关问题(js)

21.合并两个有序链表 var mergeTwoLists function(list1, list2) {if(list1null) return list2if(list2null) return list1let newHead new ListNode(0,null) //创建一个虚拟节点let cur newHeadlet cur1 list1,cur2 list2while(cur1&&cur2){if(cur1.val<cur2.…

PowerToys Windows 工具集

Microsoft PowerToys | Microsoft Learn Microsoft PowerToys&#xff1a;用于自定义 Windows 的实用工具 项目2023/04/1918 个参与者 反馈 Microsoft PowerToys 是一组实用工具&#xff0c;可帮助高级用户调整和简化其 Windows 体验&#xff0c;从而提高工作效率。 安装 …

Unity之效应器

主要作用&#xff1a;在一个区域内让游戏对象受到力和扭矩力的作用 1、创建一个精灵&#xff08;绿色区域&#xff09; 2、为其添加碰撞器&#xff08;要将Used By Effector和is Trigger打钩&#xff09; 3、添加效应器组件 4、区域效应器参数 Use Collider Mask&#xff1a;…

第3章 Class and Object

构造函数 Guaranteed initialization with the constructor使用构造函数保证初始化 • If a class has a constructor, the compiler automatically calls that constructor at the point an object is created, before client programmers can get their hands on the o…

Solidity基础五

暂时的一事无成也代表将来万事皆有可能&#xff01; 目录 一、对Solidity文件的理解 二、Solidity的导sol文件&#xff08;库、合约&#xff09; 三、Solidity的继承 1.继承的分类 2.继承的可见性 3.父合约构造函数的传参 4.调用父合约成员 5.重写 四、Solidity的抽象…

Solidity基础八

别慌&#xff0c;月亮也在大海某处迷茫 目录 一、Solidity 编程风格 1. 代码布局 2. 代码中各部分的顺序 3. 命名约定 二、Solidity 智能合约编写过程 1. solidity Hello World 2. 版本声明 3. 导入声明 4. 合约声明 三、Solidity 合约结构 智能合约 Test 四、So…

Solidity基础六

生活本来就是平凡琐碎的&#xff0c;哪有那么多惊天动地的大事&#xff0c;快乐的秘诀就是不管对大事小事都要保持热情 目录 一、Solidity的特殊变量(全局) 二、Solidity的不可变量 immutable的赋值方式 三、Solidity的事件与日志 事件和日志加深理解 四、Solidity的异常…

EMLP2021 | Google大模型微调经典论文prompt tuning

一、概述 title&#xff1a;The Power of Scale for Parameter-Efficient Prompt Tuning 论文地址&#xff1a;https://arxiv.org/abs/2104.08691 代码&#xff1a;GitHub - google-research/prompt-tuning: Original Implementation of Prompt Tuning from Lester, et al, …