lpflpf

搬砖程序员带你飞

砖搬得多了,就能盖楼

Rust 编程语言 - 常见编程概念

阅读Rust程序设计语言笔记

变量和可变性

  1. 变量默认是不可改变的(immutable)
  2. 可变变量,需要加 mut 修饰 let mut x = 5
  3. 常量 使用 const 定义
    1. const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
    2. 需要申明常量类型
    3. 常量只能被设置为常量表达式,不能是运行时计算出的值 (和变量区别)
  4. 隐藏,变量遮蔽。重新申明变量,前面申明的变量会隐藏
    1. 隐藏时,可以改变变量类型

数据类型

  1. 指定数据类型,或者可以推断出数据类型;
  2. 标量类型:整型,浮点型,布尔型,字符型
  3. 整形
    1. 有符号,无符号
    2. 8,16,32,64,128,arch 几种长度
    3. 支持下划线分隔符
    4. 整形溢出,debug 会panic;release 会忽略高位
    5. 数字可以加后缀 123u16 16位的数字 123
  4. 浮点型
    1. f32,f64;
    2. IEE-754
  5. 数值运算
    1. 整数除法,四舍五入
  6. bool true|false
  7. 字符类型
    1. 四个字节,一个Unicode标量
  8. 复合类型
    1. 元组
      1. 申明后长度不会增大缩小;类型不必相同
      2. 通过模式匹配解构(destructuring)元组值
      3. 通过(.) 加索引访问
      4. let x: (i32, i64, f32) = (100, 0, .3)
    2. 数组
      1. 长度固定;类型必须相同;
      2. 不固定长度,需要使用vector 类型(标准库提供)
      3. let a = [1,2,3,4,5]
      4. let a: [i32; 5] = [1,2,3,4,5]; 指定类型
      5. let a = [3;5] 创建5个3
      6. 访问超出界限,会panic

函数

  1. 加分号是语句,不加分号是表达式(又返回值)
1
2
3
4
5
6
7
8
fn a_func(x: i32){
   println!("hello world");
}

// 返回值类型是i32,返回数据是5
fn five() -> i32 {
   5
}

注释

  1. // 注释
  2. /// 文档注释

控制流

  1. if 语句
  2. 条件不用加括号
  3. 必须bool类型,不能自动转换
  4. 可以使用let语句赋值
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// if 不用加括号
// 必须是bool类型,不会自动转换
if number < 5 {
   println!("")
}else if number % 3 == 0 {
   println!("")
}else {
   println!("")
}

// if else 返回类型必须相同
let number = if condition {5} else {6};
  1. 循环 (loop while/for)
  2. break 中断; 可以带返回值中断
1
2
3
4
5
6
7
let result = loop {
   counter += 1;

   if counter == 10 {
      break counter * 2; // result 赋值为20
   }
}
  1. 多个循环之间消除歧义

标签 ‘counting_up (这个好诡异)

Rust 编程语言 - 猜数字游戏

阅读Rust程序设计语言笔记

输入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 引入输入输出库到当前作用域
use std::io;

// 入口函数
fn main() {
    println!("Guess the number!");

    println!("Please input youer guess.");

    // let 创建的变量默认不可变
    // 通过增加 mut 制定变量可变
    // new 是关联函数(静态方法)
    // String::new() 申请一个可增长的字符串
    let mut guess = String::new(); 

    io::stdin()
        .read_line(&mut guess) // & 引用传递, mut 可变变量返回Result<usize, Error> (枚举类型)
        .expect("Failed to read line");

    // 占位打印
    println!("You guessed: {guess}")
}

cargo run 运行

Rust 编程语言 - 安装

阅读Rust程序设计语言笔记

安装

  • 下载rustup脚本,并安装 curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
  • 或者直接brew install rust安装
  • 通过 rustc --verison 查看是否成功
1
rustc 1.66.0 (69f9c33d7 2022-12-12) (built from a source tarball)

hello world

1
2
3
4
5
6
7
8
9
// file main.rs

// main 是函数入口
fn main() {

    // println! 有感叹号是 rust 的宏
    // ; 语句结尾
    println!("Hello, world!");
}

执行 rustc main.rs 编译,./main执行; 可以通过rustfmt 格式化代码

服务发现

调研结果

  • eureka 已不维护,排除
  • nacos,consul 都提供了丰富的功能。
    • nacos 健康检查是provider 心跳;consul 是服务端做心跳。
    • 都提供了dns, http api 的发现功能
    • 都有详细metrix监控能力
    • nacos 有命名空间,consul 开源版本不支持
    • 都可以做鉴权
    • 运维成本:都存在一定运维成本。
  • nacos, consul 都提供了 配置管理功能。
    • nacos watch 回调方式,使用的主动请求
  • core-dns 无需入侵代码。其他均有代码入侵
    • core-dns 不支持集群外的服务发现,其他服务支持
    • core-dns 对细粒度的心跳检测做的不太好。(比如针对某个接口的POST操作等)
  • 个人建议
    • 在K8S集群内部做服务发现,不建议引入其他服务发现的依赖,使用core-dns即可
    • 如果需要做集群外部的服务依赖,或者有特殊的心跳检查,建议使用nacos。

微服务重的服务发现模式

下图是微服务下的各类模式。其中,服务发现仅是各系统间沟通的一种模式。

0%