三十四、服务治理、实现负载均衡、

news2025/5/11 17:07:44

1、服务治理介绍

先来思考一个问题

通过上一章的操作,我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址

(ip,端口)等硬编码到了代码中,这种做法存在许多问题:

l 一旦服务提供者地址变化,就需要手工修改代码

l 一旦是多个服务提供者,无法实现负载均衡功能

l 一旦服务变得越来越多,人工维护==调用关系==困难

那么应该怎么解决呢, 这时候就需要通过注册中心动态的实现服务治理

*什么是服务治理*

服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现

服务注册:在服务治理框架中,都会构建一个*注册中心*,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的*清单*,服务注册中心需要以*心跳30s 90s*的方式去监测清单中 的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。

服务发现:服务调用方向服务注册中心咨询服务,并获取*所有服务*的实例清单,实现对具体服务实例的访问。

1.1 常见的服务治理组件

eureka: 它是netflix公司提供的一款组件,这款组件已经停止更新。

nacos: 它是阿里巴巴提供的一款服务治理组件。

zookeeper: 它是apache公司提供的服务治理组件。

consul: 服务治理的组

1.2 安装nacos治理组件

Releases · alibaba/nacos · GitHub

解压到当前目录---不要带中文

修改完,保存

在浏览器访问

http://localhost:8848/nacos

账号:nacos

密码:nacos 

1.3 微服务注册到注册中心

(1) 引入nacos的依赖

        <!--nacos依赖-->

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

(2)配置文件指定注册中心的地址

# 注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848

(3)为微服务起名

# 起名字 单词之间使用-划线
spring.application.name=qy163-product

完成版application.properties配置类

# 端口号:8080~8090
server.port=8080

#数据源
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud-product?serverTimezone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=admin

#打印 sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# 注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848

# 起名字 单词之间使用-划线
spring.application.name=qy163-product

(4)修改订单微服务的代码

package com.aaa.order.controller;

import com.aaa.order.service.OrderService;
import com.aaa.pojo.Order;
import com.aaa.pojo.Product;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @program: parent
 * @author: Jmy
 * @create: 2023-05-12 18:56
 **/
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    //该类默认没有交给spring容器管理
    @Autowired
    private RestTemplate restTemplate;

    //在springcloud中提供了一个类DiscoveryClient 该类可以从注册中心naco拉取指定的服务清单
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("save")
    public String save(Integer pid,Integer num){ //需要传入 商品id,数量信息
        Order order = new Order();
        order.setUid(1);
        order.setUsername("猪八戒");
        order.setNumber(num);

        List<ServiceInstance> instances = discoveryClient.getInstances("qy163-product");
        ServiceInstance serviceInstance = instances.get(0);//获取第一个服务实例
        //System.out.println(serviceInstance.getUri());//http://192.168.126.1:8080
        String path = serviceInstance.getUri().toString();
        
        //商品信息的设置:远程调用商品微服务的接口,基于Http协议进行远程调用
        //两种基于HTTP调用的方式:
        //第一种:可以使用httpclient工具jar 自己封装工具类(不用)
        //第二种:spring框架中提供了一个工具类,RestTemplate

        Product product = restTemplate.getForObject(path+"/product/getById/" + pid, Product.class);
        if(product == null){
            return "下单失败";
        }

        order.setPid(product.getPid());
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());

        orderService.save(order);

        return "下单成功";
    }
}

2、实现负载均衡

2.1 什么是负载均衡

负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行

可以手动完成负载均衡

2.2集群的搭建

2.3修改Order调用方 

package com.aaa.order.controller;

import com.aaa.order.service.OrderService;
import com.aaa.pojo.Order;
import com.aaa.pojo.Product;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Random;

/**
 * @program: parent
 * @author: Jmy
 * @create: 2023-05-12 18:56
 **/
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    //该类默认没有交给spring容器管理
    @Autowired
    private RestTemplate restTemplate;

    //在springcloud中提供了一个类DiscoveryClient 该类可以从注册中心naco拉取指定的服务清单
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("save")
    public String save(Integer pid,Integer num){ //需要传入 商品id,数量信息
        Order order = new Order();
        order.setUid(1);
        order.setUsername("猪八戒");
        order.setNumber(num);

        List<ServiceInstance> instances = discoveryClient.getInstances("qy163-product");

        //随机负载均衡
        int i = new Random().nextInt(instances.size());

        ServiceInstance serviceInstance = instances.get(i);//获取第一个服务实例
        //System.out.println(serviceInstance.getUri());//http://192.168.126.1:8080
        String path = serviceInstance.getUri().toString();

        //商品信息的设置:远程调用商品微服务的接口,基于Http协议进行远程调用
        //两种基于HTTP调用的方式:
        //第一种:可以使用httpclient工具jar 自己封装工具类(不用)
        //第二种:spring框架中提供了一个工具类,RestTemplate

        Product product = restTemplate.getForObject(path+"/product/getById/" + pid, Product.class);
        if(product == null){
            return "下单失败";
        }

        order.setPid(product.getPid());
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());

        orderService.save(order);

        return "下单成功";
    }
}

2.4 使用ribbon完成负载均衡

2.4.1什么是ribbon

ribbon:是Netflix发布的一个负载均衡器,有助于控制Http和Tcp客户端行为。在SpringCloud中,nacos一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从nacos中读取到的服务信息,在调用服务节点提供的服务时,会合理(策略)的进行负载。在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务。

基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进行调

2.4.2如何使用ribbon

(1)在RestTemplate类上加个注解@LoadBalance

package com.aaa.order;

import org.mybatis.spring.annotation.MapperScan;
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;

/**
 * @program: parent
 * @author: Jmy
 * @create: 2023-05-12 18:46
 **/
@SpringBootApplication
@MapperScan(basePackages = "com.aaa.order.dao")
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class,args);
    }

    @Bean
    @LoadBalanced //springcloud在扫描时会帮你完成从注册中心拉取服务清单的功能
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(2)修改controller层代码

package com.aaa.order.controller;

import com.aaa.order.service.OrderService;
import com.aaa.pojo.Order;
import com.aaa.pojo.Product;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Random;

/**
 * @program: parent
 * @author: Jmy
 * @create: 2023-05-12 18:56
 **/
@RestController
@RequestMapping("/order")
public class OrderController02 {

    @Autowired
    private OrderService orderService;

    //该类默认没有交给spring容器管理
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("save")
    public String save(Integer pid,Integer num){ //需要传入 商品id,数量信息
        Order order = new Order();
        order.setUid(1);
        order.setUsername("猪八戒");
        order.setNumber(num);

        //商品信息的设置:远程调用商品微服务的接口,基于Http协议进行远程调用
        //两种基于HTTP调用的方式:
        //第一种:可以使用httpclient工具jar 自己封装工具类(不用)
        //第二种:spring框架中提供了一个工具类,RestTemplate

        Product product = restTemplate.getForObject("http://qy163-product/product/getById/" + pid, Product.class);
        if(product == null){
            return "下单失败";
        }

        order.setPid(product.getPid());
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());

        orderService.save(order);

        return "下单成功";
    }
}

ribbon默认采用的是轮询策略。 是否可以修改负载均衡策略。

ribbon内置的负载均衡策略

Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为 com.netflix.loadbalancer.IRule , 具体的负载策略如下图所示:

2.4.3如何改变ribbon的负载均衡策略

修改order的配置文件

# 修改ribbon负载均衡策略
qy163-product.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

#解释 qy163-product:表示对访问哪个微服务设置负载均衡策略
#com.netflix.loadbalancer.RandomRule:负载均衡策略类

使用ribbon完成了从nacos自动拉取服务,并完成负载均衡功能。

3、使用Openfeign完成远程调用

上面服务之间的调用 使用的是RestTemplate. 使用Resttemplate远程调用,它不符合我们的编程习惯。Controller---Service---Dao 再Controller注入一个service对象,然后调用service中的方法,根据方法传递相应的参数以及接受方法的返回的结果。

我们可以使用Openfeign组件来完成。

什么是OpenFeign

OpenFeign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了OpenFeign, OpenFeign负载均衡默认集成了 Ribbon, 所以在Nacos下使用OpenFegin默认就实现了负载均衡的效果。

总结: openfeign就是为了完成服务的远程调用,它就像调用本地方法一样。

3.1如何使用OpenFeign

(1) 依赖openfeign依赖

<!--openfeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(2)定义接口并添加@FeignClient(value="服务提供者的名")注解

package com.aaa.order.feign;

import com.aaa.pojo.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @program: parent
 * @author: Jmy
 * @create: 2023-05-14 14:18
 **/

//@FeignClient(value="服务提供者的名字")
@FeignClient(value = "qy163-product")
public interface ProductFeign {

    //抽象方法一定要和服务提供者的接口方法一模一样
    @GetMapping("/product/getById/{pid}")
    public Product getById(@PathVariable Integer pid);
}

(3)在主启动类开启openfeign注解驱动

package com.aaa.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @program: parent
 * @author: Jmy
 * @create: 2023-05-12 18:46
 **/
@SpringBootApplication
@MapperScan(basePackages = "com.aaa.order.dao")
@EnableFeignClients //开启openFeign注解驱动
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class,args);
    }

    @Bean
    @LoadBalanced //springcloud在扫描时会帮你完成从注册中心拉取服务清单的功能
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

 (4)在使用的类中注入Openfeign注解

package com.aaa.order.controller;

import com.aaa.order.feign.ProductFeign;
import com.aaa.order.service.OrderService;
import com.aaa.pojo.Order;
import com.aaa.pojo.Product;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @program: parent
 * @author: Jmy
 * @create: 2023-05-12 18:56
 **/
@RestController
@RequestMapping("/order")
public class OrderController03 {

    @Autowired
    private OrderService orderService;

     //注入openfeign接口
    @Autowired
    private ProductFeign productFeign;

    @GetMapping("save")
    public String save(Integer pid,Integer num){ //需要传入 商品id,数量信息
        //springCloud扫描到@FeignClient注解后,就会为该注解接口生成一个代理实现类,再把代理实现类注册改为相应的属性
        
        
        Order order = new Order();
        //用户信息--登录中获取
        order.setUid(1);
        order.setUsername("猪八戒");
        order.setNumber(num);

        Product product = productFeign.getById(pid);
        if(product == null){
            return "下单失败";
        }

        order.setPid(product.getPid());
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());

        orderService.save(order);

        return "下单成功";
    }
}

总结

4、eureka作为注册中心[了解]

它的官网没有提供下载包。只能自己创建eureka的服务端。

(1)搭建eureka服务

(2)引入相关依赖

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.aaa</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>eureka</artifactId>

    <dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

    </dependencies>
    <build>
        <finalName>eureka</finalName>
    </build>
</project>

(3)配置文件

server.port=7001

eureka.instance.hostname=localhost
#是否把该服务注册到eureka服务上
eureka.client.register-with-eureka=false
#是否该服务从注册中心eureka上拉取服务
eureka.client.fetch-registry=false

#微服务访问eureka访问的地址
eureka.client.service-url.defaultZone=http://localhost:7001/eureka/

#安全设置
security.basic.enabled=false

(4)主启动类

package com.aaa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @program: parent
 * @author: Jmy
 * @create: 2023-05-14 14:54
 **/

@SpringBootApplication
@EnableEurekaServer //开启eureka服务
public class EurekaApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApp.class,args);
    }

}

其他微服务可以注册到eureka

(1)在product的pom里加入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

(2)修改配置文件

eureka.client.service-url.defaultZone=http://localhost:7001/eureka/

 

 

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

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

相关文章

浪潮之巅第一章 — 帝国的余辉(ATT)(一) 阅读笔记

在这十几年间&#xff0c;它们代表着科技的浪潮&#xff0c;直到下一波浪潮的来临。 从一百年前算起&#xff0c;AT&T 公司、IBM 公司、苹果公司 (Apple)、英特尔 (Intel) 公司、微软 (Microsoft) 公司、思科公司 (Cisco) 公司、雅虎 (Yahoo) 公司和谷歌 (Google) 公司都先…

相见恨晚的Matlab编程小技巧(2)-代码怎么做到逻辑清晰?——巧用注释符“%“

本文将以教程的形式详细介绍Matlab中两个常用符号“%”和“%%”的作用。初学者可以通过此文掌握这两个符号的用法&#xff0c;为Matlab编程打下坚实的基础。 一、什么是“%”符号&#xff1f; 在 Matlab 中&#xff0c;“%” 符号是注释符号&#xff0c;它后面的文本被视为注释…

GEE:下载MODIS海表温度影像

作者:CSDN @ _养乐多_ 本篇博客将介绍如何使用Google Earth Engine(GEE)平台下载MODIS(Moderate Resolution Imaging Spectroradiometer)海表温度影像数据。MODIS是一种遥感传感器,用于监测地球表面的温度变化。我们将展示如何获取MODIS数据集,并选择特定感兴趣区域进行…

C#操作Redis明细内容 C#调用redis c#使用redis业务 C# Redis操作类 C#中Redis封装的类 C#和Redis客户端

谈下你对 Redis 的了解&#xff1f; 1&#xff09;Redis是一种基于键值对的NoSQL数据库&#xff08;非关系型数据库&#xff09;&#xff1b;是一个key-value存储系统 2&#xff09;高性能、可靠性 Redis将数据存储在内存中&#xff0c;读写性能高&#xff1b;Redis提供了 R…

第四十天学习记录:C语言进阶:笔试题整理Ⅰ

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main() {unsigned long pulArray[] { 6,7,8,9,10 };unsigned long* pulPtr;pulPtr pulArray;*(pulPtr 3) 3;printf("%d,%d\n", *pulPtr, *(pulPtr 3));//6 12return 0; }输出&#xff1a;6&#…

哈工大软件过程与工具作业1(100以内加减法练习小软件)

softwareProcess-lab1-master 哈工大软件过程与工具作业1 100以内加减法练习小软件 地址&#xff1a;https://github.com/944613709/Addition-and-subtraction-practice-small-software 项目概述 &#xff08;1&#xff09;项目名称&#xff1a;100以内加减法练习小软件 &…

一图看懂 markupsafe 模块:为 Python 实现 XML/HTML/XHTML 标记安全字符串,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 markupsafe 模块&#xff1a;为 Python 实现 XML/HTML/XHTML 标记安全字符串&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9ca;模块图…

【JAVA】Java中的类型转换

目录 1.自动类型转换&#xff08;隐式转换&#xff0c;小类型转换为大类型&#xff09; 2.强制类型转换&#xff08;显示转换&#xff0c;大类型转换为小类型&#xff09; 3.小于4字节的类型转换问题 3.1 byte<->int 3.2 char<->int 3.3 String<->int …

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-4

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-4 垃圾收集器与内存分配策略经典垃圾收集器Serial Old收集器CMS收集器Garbage First收集器 垃圾收集器与内存分配策略 经典垃圾收集器 Serial Old收集器 Serial Old是Serial收集器的老年代版本&#xff0c;它同样…

Liunx基础命令 - find命令

find命令 – 根据路径和条件搜索指定文件 find命令的功能是用于根据给定的路径和条件查找相关文件或目录&#xff0c;参数灵活方便&#xff0c;且支持正则表达式&#xff0c;结合管道符后能够实现更加复杂的功能&#xff0c;是Linux系统运维人员日常工作必须掌握的命令之一。 …

跟小枫社长学建站

该文章为看视频时的一些笔记&#xff0c;完整版可以看小枫社长的视频 小枫社长视频原址 一、租云服务器 腾讯云阿里云 阿里云对控制台进行了全面升级&#xff0c;在首页使用了新的设计方案&#xff0c;云服务器ECS位置如下&#xff0c;点击左上角目录即可。 二、创建实例 云…

牛客网面试必刷:BM22 比较版本号

牛客网面试必刷&#xff1a;BM22 比较版本号 前言一、解法1&#xff1a;分割截取 前言 牛客项目发布项目版本时会有版本号&#xff0c;比如1.02.11&#xff0c;2.14.4等等 现在给你2个版本号version1和version2&#xff0c;请你比较他们的大小 版本号是由修订号组成&#xf…

三十三、微服务,SpringCloud架构

1、微服务架构 1.1 单体应用架构 将项目所有模块(功能)打成jar或者war&#xff0c;然后部署一个进程 优点: 1:部署简单:由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。 2:技术单一:项目不需要复杂的技术栈&#xff0c;往往一套熟悉的技术栈就可以完成开发。…

JAVA8的新特性——Stream

JAVA8的新特性——Stream 在这个深夜写下这篇笔记&#xff0c;窗外很安静&#xff0c;耳机里是《季节更替》&#xff0c;我感触还不是很多&#xff0c;当我选择封面图片的时候才发现我们已经渐渐远去&#xff0c;我们都已经奔赴生活&#xff0c;都在拼命想着去换一个活法&#…

Kubernetes 二进制部署高可用集群

概述 在私有局域网内完成Kubernetes二进制高可用集群的部署 ETCD Openssl > ca 证书 Haproxy Keepalived Kubernetes 主机规划 序号名字功能VMNET 1备注 1备注 2备注 3 备注 4备注 50orgin界面192.168.164.10haproxykeepalived1reporsitory仓库192.168.164.16yum 仓库re…

哈工大C语言大作业-学生成绩管理系统

哈工大C语言大作业-学生成绩管理系统 完整项目地址&#xff1a;https://github.com/944613709/Student-Performance-Management-System-ByC 说明 l 设计了学生成绩管理系统&#xff0c;来实现对于学生数据的录入统计等各个功能l 进入主菜单之前执行音效播放l menu主菜单中显…

C语言基础知识:C语言中的控制语句

目录 1. 条件判断语句 if(…) {…} if(…) {…} else {…} if(…) {…} else if(…) {…} … else if(…) {…} else {…} switch() {case …: …; case …: …; … default: …;} 2、循环语句 while语句 do while语句 for语句 3、循环体中的跳转语句 break语句。 c…

consul集群部署-linux

一.前言 1. Consul架构 consul是分布式、高可用的系统&#xff0c;下图是单数据中心的部署架构 2. Consul特性 服务发现&#xff1a;解决在分布式环境中&#xff0c;如何找到可用的服务地址的问题&#xff0c;支持通过DNS和HTTP查询服务地址。健康检查&#xff1a;定时监控服务…

如何正确学习网络安全(黑客)?看到就是赚到!

一、前言 本人10 年工作经验&#xff0c; 擅长 Web 安全攻防、渗透领域&#xff0c; 在金融领域的安全有丰富的实战经验。从事在线教育 3 年多培养学员过万&#xff0c;讲解清晰透彻&#xff0c;课程干货内容多&#xff0c;辅导学员耐心细致 那我们该如何正确学习网络安全&am…

[学习笔记] [机器学习] 5. 逻辑回归(逻辑回归、混淆矩阵、分类评估指标、ROC曲线、AUC指标、类别不均衡问题)

视频链接数据集下载地址&#xff1a;无需下载 本文学习目标&#xff1a; 知道逻辑回归的损失函数、优化方法知道逻辑回归的应用场景应用LogisticRegression实现逻辑回归预测知道精确率、召回率等指标的区别知道如何解决样本不均衡情况下的评估会绘制ROC曲线图形 1. 逻辑回归…