Spring Cloud Netflix學習筆記01

文章目錄

  • 前言
  • 一、微服務概述
    • 什么是微服務?
    • 微服務與微服務架構
    • 微服務優缺點
      • 優點
      • 缺點
    • 微服務技術棧有那些?
  • 二.SpringCloud入門概述
    • SpringCloud是什么?
    • SpringCloud和SpringBoot的關系
    • Dubbo 和 SpringCloud技術選型
      • 總結
    • SpringCloud能干嘛?
    • SpringCloud下載
  • 三、環境搭建
    • SpringCloud版本選擇
    • 創建父工程
    • 創建子項目
      • springcloud-api
      • springcloud-provider-dept-8001
      • springcloud-consumer-dept-80


在這里插入圖片描述

前言

Spring Cloud Netflix 是 Spring Cloud 生態體系中基于 Netflix 開源組件(如 Eureka、Hystrix、Zuul、Ribbon 等)封裝的微服務解決方案,旨在簡化分布式系統(微服務架構)的開發。它整合了 Netflix 多年來在分布式系統領域的實踐經驗,提供了服務注冊與發現、負載均衡、服務熔斷與降級、API 網關等核心功能,幫助開發者快速構建高可用、可擴展的微服務架構。

Spring Cloud Netflix 的幾大組件:

  • 服務注冊與發現——Netflix Eureka
  • 客戶端負載均衡——Netflix Ribbon
  • 聲明式服務調用——Feign
  • 斷路器——Netflix Hystrix
  • 服務網關——Netflix Zuul
  • 分布式配置——Spring Cloud Config

Spring Cloud Netflix中有些組件已經不再更新了,并且現在大部分公司使用的還是Spring Cloud Alibaba。所以除了項目需要,建議直接學習Spring Cloud Alibaba。


一、微服務概述

什么是微服務?

微服務(Microservice Architecture) 關于它的概念很難一言以蔽之。究竟什么是微服務呢?我們在此引用ThoughtWorks 公司的首席科學家 Martin Fowler 于2014年提出的一段話:

  • 就目前而言,對于微服務,業界并沒有一個統一的,標準的定義。
  • 但通常而言,微服務架構是一種架構模式,或者說是一種架構風格,它提倡將單一的應用程序劃分成一組小的服務,每個服務運行在其獨立的自己的進程內,服務之間互相協調,互相配置,為用戶提供最終價值。
  • 服務之間采用輕量級的通信機制(HTTP)互相溝通,每個服務都圍繞著具體的業務進行構建,并且能狗被獨立的部署到生產環境中。
  • 另外,應盡量避免統一的,集中式的服務管理機制,對具體的一個服務而言,應該根據業務上下文,選擇合適的語言,工具(Maven)對其進行構建,可以有一個非常輕量級的集中式管理來協調這些服務,可以使用不同的語言來編寫服務,也可以使用不同的數據存儲。

再來從技術維度角度理解下:

  • 微服務化的核心就是將傳統的一站式應用,根據業務拆分成一個一個的服務,徹底地去耦合,每一個微服務提供單個業務功能的服務,一個服務做一件事情,從技術角度看就是一種小而獨立的處理過程,類似進程的概念,能夠自行單獨啟動或銷毀,擁有自己獨立的數據庫。
    原文:https://martinfowler.com/articles/microservices.html

微服務與微服務架構

微服務
強調的是服務的大小,它關注的是某一個點,是具體解決某一個問題/提供落地對應服務的一個服務應用,狹義的看,可以看作是IDEA中的一個個微服務工程,或者Moudel。IDEA 工具里面使用Maven開發的一個個獨立的小Moudel,它具體是使用SpringBoot開發的一個小模塊,專業的事情交給專業的模塊來做,一個模塊就做著一件事情。強調的是一個個的個體,每個個體完成一個具體的任務或者功能。

微服務架構
一種新的架構形式,Martin Fowler 于2014年提出。
微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務,服務之間相互協調,互相配合,為用戶提供最終價值。每個服務運行在其獨立的進程中,服務與服務之間采用輕量級的通信機制(如HTTP)互相協作,每個服務都圍繞著具體的業務進行構建,并且能夠被獨立的部署到生產環境中,另外,應盡量避免統一的,集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言、工具(如Maven)對其進行構建。

微服務優缺點

優點

  • 單一職責原則;
  • 每個服務足夠內聚,足夠小,代碼容易理解,這樣能聚焦一個指定的業務功能或業務需求;
  • 開發簡單,開發效率高,一個服務可能就是專一的只干一件事;
  • 微服務能夠被小團隊單獨開發,這個團隊只需2-5個開發人員組成;
  • 微服務是松耦合的,是有功能意義的服務,無論是在開發階段或部署階段都是獨立的;
  • 微服務能使用不同的語言開發;
  • 易于和第三方集成,微服務允許容易且靈活的方式集成自動部署,通過持續集成工具,如jenkins,Hudson,bamboo;
  • 微服務易于被一個開發人員理解,修改和維護,這樣小團隊能夠更關注自己的工作成果,無需通過合作才能體現價值;
  • 微服務允許利用和融合最新技術;
  • 微服務只是業務邏輯的代碼,不會和HTML,CSS,或其他的界面混合;
  • 每個微服務都有自己的存儲能力,可以有自己的數據庫,也可以有統一的數據庫;

缺點

  • 開發人員要處理分布式系統的復雜性;
  • 多服務運維難度,隨著服務的增加,運維的壓力也在增大;
  • 系統部署依賴問題;
  • 服務間通信成本問題;
  • 數據一致性問題;
  • 系統集成測試問題;
  • 性能和監控問題;

微服務技術棧有那些?

微服務技術條目落地技術
服務開發SpringBoot、Spring、SpringMVC等
服務配置與管理Netfix公司的Archaius、阿里的Diamond等
服務注冊與發現Eureka、Consul、Zookeeper等
服務調用Rest、PRC、gRPC
服務熔斷器Hystrix、Envoy等
負載均衡Ribbon、Nginx等
服務接口調用(客戶端調用服務的簡化工具)Fegin等
消息隊列Kafka、RabbitMQ、ActiveMQ等
服務配置中心管理SpringCloudConfig、Chef等
服務路由(API網關)Zuul等
服務監控Zabbix、Nagios、Metrics、Specatator等
全鏈路追蹤Zipkin、Brave、Dapper等
數據流操作開發包SpringCloud Stream(封裝與Redis,Rabbit,Kafka等發送接收消息)
時間消息總棧SpringCloud Bus
服務部署Docker、OpenStack、Kubernetes等

二.SpringCloud入門概述

SpringCloud是什么?

Spring官網:https://spring.io/
在這里插入圖片描述

SpringCloud和SpringBoot的關系

  • SpringBoot專注于開蘇方便的開發單個個體微服務;
  • SpringCloud是關注全局的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務,整合并管理起來,為各個微服務之間提供:配置管理、服務發現、斷路器、路由、為代理、事件總棧、全局鎖、決策競選、分布式會話等等集成服務;
  • SpringBoot可以離開SpringCloud獨立使用,開發項目,但SpringCloud離不開SpringBoot,屬于依賴關系;
  • SpringBoot專注于快速、方便的開發單個個體微服務,SpringCloud關注全局的服務治理框架;

Dubbo 和 SpringCloud技術選型

  1. 分布式+服務治理Dubbo
    目前成熟的互聯網架構,應用服務化拆分 + 消息中間件
  2. Dubbo 和 SpringCloud對比
    可以看一下社區活躍度:
    https://github.com/dubbo
    https://github.com/spring-cloud
DubboSpringCloud
服務注冊中心ZookeeperSpring Cloud Netfilx Eureka
服務調用方式RPCREST API
服務監控Dubbo-monitorSpring Boot Admin
斷路器不完善Spring Cloud Netfilx Hystrix
服務網關Spring Cloud Netfilx Zuul
分布式配置Spring Cloud Config
服務跟蹤Spring Cloud Sleuth
消息總棧Spring Cloud Bus
數據流Spring Cloud Stream
批量任務Spring Cloud Task

最大區別:Spring Cloud 拋棄了Dubbo的RPC通信,采用的是基于HTTP的REST方式
嚴格來說,這兩種方式各有優劣。雖然從一定程度上來說,后者(Spring Cloud)犧牲了服務調用的性能,但也避免了上面提到的原生RPC帶來的問題。而且REST相比RPC更為靈活,服務提供方和調用方的依賴只依靠一紙契約,不存在代碼級別的強依賴,這個優點在當下強調快速演化的微服務環境下,顯得更加合適。

總結

二者解決的問題域不一樣:Dubbo的定位是一款RPC框架,而SpringCloud的目標是微服務架構下的一站式解決方案。

SpringCloud能干嘛?

  • Distributed/versioned configuration 分布式/版本控制配置
  • Service registration and discovery 服務注冊與發現
  • Routing 路由
  • Service-to-service calls 服務到服務的調用
  • Load balancing 負載均衡配置
  • Circuit Breakers 斷路器
  • Distributed messaging 分布式消息管理

SpringCloud下載

官網:http://projects.spring.io/spring-cloud/
SpringCloud沒有采用數字編號的方式命名版本號,而是采用了倫敦地鐵站的名稱,同時根據字母表的順序來對應版本時間順序,比如最早的Realse版本:Angel,第二個Realse版本:Brixton,然后是Camden、Dalston、Edgware,目前最新的是Hoxton SR4 CURRENT GA通用穩定版。

自學參考書:

  • SpringCloud Netflix 中文文檔:https://springcloud.cc/spring-cloud-netflix.html
  • SpringCloud 中文API文檔(官方文檔翻譯版):https://springcloud.cc/spring-cloud-dalston.html
  • SpringCloud中國社區:http://springcloud.cn/
  • SpringCloud中文網:https://springcloud.cc

三、環境搭建

SpringCloud版本選擇

spring-boot-starter-parentspring-cloud-dependencles
版本號發布日期版本號發布日期
1.5.2.RELEASE2017-03Dalston.RC12017-x
1.5.9.RELEASE2017-11Edgware.RELEASE2017-11
1.5.16.RELEASE2018-04Edgware.SR52018-10
1.5.20.RELEASE2018-09Edgware.SR52018-10
2.0.2.RELEASE2018-05Fomchiey.BULD-SNAPSHOT2018-x
2.0.6.RELEASE2018-10Fomchiey-SR22018-10
2.1.4.RELEASE2019-04Greenwich.SR12019-03

創建父工程

  • 新建父工程項目springcloud-netflix,切記Packageing是pom模式
  • 主要是定義POM文件,將后續各個子模塊公用的jar包等統一提取出來,類似一個抽象父類

完整的pom

<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>com.qf</groupId><artifactId>springcloud-netflix</artifactId><version>1.0-SNAPSHOT</version><!--打包方式  pom--><packaging>pom</packaging><name>springcloud-netflix</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version></properties><dependencyManagement><dependencies><!--springCloud的依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.SR1</version><type>pom</type><scope>import</scope></dependency><!--SpringBoot--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.4.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--數據庫--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!--SpringBoot 啟動器--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><!--日志測試~--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</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><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></dependencyManagement>
</project>

創建子項目

創建子項目springcloud-api(公共模塊)、springcloud-provider-dept-8001(生產者)、springcloud-consumer-dept-80(消費者)

在父項目上右鍵創建
在這里插入圖片描述

springcloud-api

pom.xml

<parent><groupId>com.qf</groupId><artifactId>springcloud-netflix</artifactId><version>1.0-SNAPSHOT</version>
</parent><artifactId>springcloud-api</artifactId>
<packaging>jar</packaging><name>springcloud-api</name>
<url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>

實體類

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;@Data
@NoArgsConstructor
@Accessors(chain = true)
public class Dept  implements Serializable {private Long deptno;private String dname;private String db_source;
}

springcloud-provider-dept-8001

pom.xml

<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><parent><groupId>com.qf</groupId><artifactId>springcloud-netflix</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>springcloud-provider-dept-8001</artifactId><packaging>jar</packaging><name>springcloud-provider-dept-8001</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.qf</groupId><artifactId>springcloud-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--jetty--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency><!--熱部署工具--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency></dependencies>
</project>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!--開啟二級緩存--><setting name="cacheEnabled" value="true"/></settings>
</configuration>

application.yml

server:port: 8001servlet:context-path: /
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8username: rootpassword: 123456driver-class-name: org.gjt.mm.mysql.Drivermybatis:type-aliases-package: com.qf.pojoconfig-location: classpath:mybatis-config.xmlmapper-locations: classpath:mapper/*.xml

啟動類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DeptProvider {public static void main(String[] args) {SpringApplication.run(DeptProvider.class,args);}
}

mapper

import com.qf.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;@Mapper
@Repository
public interface DeptDao {public boolean addDept(Dept dept);public Dept queryById(@Param("deptno") Long deptno);public List<Dept> queryAll();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qf.dao.DeptDao"><insert id="addDept" parameterType="Dept">insert into dept(dname,db_source)values(#{dname},DATABASE());</insert><select id="queryById" resultType="com.qf.pojo.Dept">select * from dept where deptno = #{deptno};</select><select id="queryAll" resultType="com.qf.pojo.Dept">select * from dept;</select>
</mapper>

Service

import com.qf.pojo.Dept;
import org.apache.ibatis.annotations.Param;
import java.util.List;public interface DeptService {public boolean addDept(Dept dept);public Dept queryById(@Param("deptno") Long deptno);public List<Dept> queryAll();}
import com.qf.dao.DeptDao;
import com.qf.pojo.Dept;
import com.qf.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptDao deptDao;@Overridepublic boolean addDept(Dept dept) {return deptDao.addDept(dept);}@Overridepublic Dept queryById(Long deptno) {return deptDao.queryById(deptno);}@Overridepublic List<Dept> queryAll() {return deptDao.queryAll();}
}

Controller

import com.qf.pojo.Dept;
import com.qf.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@PostMapping("/dept/add")public boolean addDept(Dept dept) {return deptService.addDept(dept);}@GetMapping("/dept/get/{id}")public Dept queryById(@PathVariable("id") Long id) {return deptService.queryById(id);}@GetMapping("/dept/list")public List<Dept> queryAll() {return deptService.queryAll();}
}

springcloud-consumer-dept-80

pom.xml

<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><parent><groupId>com.qf</groupId><artifactId>springcloud-netflix</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>springcloud-consumer-dept-80</artifactId><packaging>jar</packaging><name>springcloud-consumer-dept-80</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.qf</groupId><artifactId>springcloud-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--熱部署工具--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency></dependencies>
</project>

application.yml

server:port: 80servlet:context-path: /

啟動類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DeptConsumer {public static void main(String[] args) {SpringApplication.run(DeptConsumer.class,args);}
}

配置類

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class ConfigBean {//@Configuration -- spring  applicationContext.xml//配置負載均衡實現RestTemplate// IRule// RoundRobinRule 輪詢// RandomRule 隨機// AvailabilityFilteringRule : 會先過濾掉,跳閘,訪問故障的服務~,對剩下的進行輪詢~// RetryRule : 會先按照輪詢獲取服務~,如果服務獲取失敗,則會在指定的時間內進行,重試@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}

Controller

import com.qf.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;@RestController
public class DeptConsumerController {/*** 理解:消費者,不應該有service層~* RestTemplate .... 供我們直接調用就可以了! 注冊到Spring中* (地址:url, 實體:Map ,Class<T> responseType)* <p>* 提供多種便捷訪問遠程http服務的方法,簡單的Restful服務模板~*/@Autowiredprivate RestTemplate restTemplate;/*** 服務提供方地址前綴* <p>* Ribbon:我們這里的地址,應該是一個變量,通過服務名來訪問*/private static final String REST_URL_PREFIX = "http://localhost:8001";/*** 消費方添加部門信息* @param dept* @return*/@RequestMapping("/consumer/dept/add")public boolean add(Dept dept) {// postForObject(服務提供方地址(接口),參數實體,返回類型.class)return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);}/*** 消費方根據id查詢部門信息* @param id* @return*/@RequestMapping("/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Long id) {// getForObject(服務提供方地址(接口),返回類型.class)return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);}/*** 消費方查詢部門信息列表* @return*/@RequestMapping("/consumer/dept/list")public List<Dept> list() {return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);}
}

Spring Cloud Netflix學習筆記01
Spring Cloud Netflix學習筆記02-Eureka
Spring Cloud Netflix學習筆記03-Ribbon
Spring Cloud Netflix學習筆記04-Feign

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919536.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

專題:2025母嬰行業消費洞察與分齡營養趨勢報告|附40 +份報告PDF、交互圖表數據匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p43654 當95后媽媽拿著計算器對比DHA純度&#xff0c;當爸爸們為“防紅屁屁紙尿褲”貨比三家&#xff0c;母嬰行業的風向早就變了。從“一把奶粉喂到3歲”到“按月齡定制營養包”&#xff0c;從“進口就好”到“看專利數據下單”&…

redhat6/centos6 配置yum源

由于RHEL6/centos6系統官方早就停止通知維護了&#xff0c;公司的開發服務器有比較老&#xff0c;發現竟然scp都沒有裝。。。今天配置個本地yum源&#xff0c;安裝一下常規軟件和開發環境比較簡單&#xff0c;直接上代碼1.上傳一個centos6的iso文件CentOS-6.5-x86_64-bin-DVD1.…

day31 SQLITE

數據庫相關函數數據庫創建int sqlite3_open( const char *filename, sqlite3 **ppDb);功能&#xff1a;打開數據庫&#xff0c;不存在則創建參數&#xff1a;const char *filename 數據庫名sqlite3 **ppDb 二級指針&#xff0c;傳出ppDb數據庫的一級指…

嵌入式-SPI番外之按鈕驅動程序的編寫-Day15

目錄 一、按鈕簡單操作回憶 二、按鈕新操作實現 &#xff08;1&#xff09;按鈕的點擊實現燈亮/滅 ①連接電路 ②初始化板載LED和按鈕 ③按鈕程序的基本原理&#xff08;核心仍為0亮/1滅&#xff09; ④按鈕消抖的原理 三、按鈕封裝的操作-點擊&#xff0c;雙擊&#xf…

星域智鏈科技:用科技點亮生活,以 AI 拓展無限可能

星域智鏈科技&#xff08;東莞市&#xff09;有限公司簡介 星域智鏈科技&#xff08;東莞市&#xff09;有限公司&#xff0c;理念是 讓科技便利生活、豐富生活&#xff0c;專注于科技、AI領域。 全場景 GPS 定位器 —— 精準追蹤&#xff0c;守護安全&#xff0c;適用于車輛…

國內代理IP在SEO行業中的應用

隨著互聯網的快速發展&#xff0c;SEO&#xff08;搜索引擎優化&#xff09;已經成為了數字營銷的重要組成部分。無論是企業還是個人站長&#xff0c;都希望通過SEO提升自己網站的排名和流量。然而&#xff0c;隨著競爭的激烈&#xff0c;傳統的SEO優化手段已經逐漸顯現出局限性…

Linux + arm 內存屏障

ARM 硬件層的屏障指令DMB (Data Memory Barrier)&#xff1a;保證在它之前的內存訪問&#xff08;符合給定域/類型&#xff09;在它之后的內存訪問之前對可見性排序。常用域&#xff1a;ish&#xff08;Inner Shareable&#xff09;&#xff0c;sy&#xff08;system-wide&…

網絡安全中的遠程控制活動檢測與防御策略

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;遠程控制技術在IT領域中用于網絡連接和設備操作&#xff0c;但同樣被黑客利用進行非法入侵。端口占用情況是識別遠程控制活動的關鍵因素&#xff0c;使用工具如"cports"可以監控這些端口。系統中未知…

UIGestureRecognizer 各個子類以及其作用

在 iOS 里&#xff0c;UIGestureRecognizer 是一個抽象基類&#xff0c;專門用來處理手勢事件。它本身不能直接用&#xff0c;必須用它的 子類。這些子類分別對應常見的手勢識別器。常見的 UIGestureRecognizer 子類及作用1. UITapGestureRecognizer作用&#xff1a;點擊手勢&a…

計算機網絡 HTTPS 全流程

HTTPS 通信的全流程&#xff08;特別是 TLS 握手階段&#xff09;中使用的三個隨機數是保障安全性的核心設計&#xff0c;不能隨意減少。每個隨機數都承擔著至關重要的安全職責。下面詳細解釋 HTTPS 全流程&#xff0c;并重點分析這三個隨機數的作用和必要性&#xff1a;&#…

DL00271-基于YOLOv11的激光雷達LiDAR船舶目標檢測含完整數據集

【CSDN推薦】基于YOLOv11的激光雷達&#xff08;LiDAR&#xff09;船舶目標檢測——含完整數據集&#xff01;&#x1f6a2; 科研人員必看&#xff01; 高校老師、學生和研究者們&#xff0c;前沿技術來了&#xff01;本論文利用YOLOv11模型&#xff0c;結合激光雷達&#xff0…

SQL-leetcode—3374. 首字母大寫 II

3374. 首字母大寫 II 表&#xff1a;user_content -------------------- | Column Name | Type | -------------------- | content_id | int | | content_text| varchar | -------------------- content_id 是這張表的唯一主鍵。 每一行包含一個不同的 ID 以及對應的文…

告別籠統的 200 OK:一份給 API 設計者的 HTTP 狀態碼終極指南

文章目錄寫在前面問題描述核心結論與建議簡要描述詳細闡述1xx - 信息性響應 (Informational)2xx - 成功 (Successful)3xx - 重定向 (Redirection)4xx - 客戶端錯誤 (Client Error)5xx - 服務器錯誤 (Server Error)HTTP 狀態碼速查表參考以及更多更詳細的狀態碼查詢寫在前面 你…

從防抖節流到鏈表樹:編程世界中的抽象優化藝術

從防抖節流到鏈表樹&#xff1a;編程世界中的抽象優化藝術 在編程的知識體系中&#xff0c;有些概念看似毫不相關&#xff0c;卻在底層邏輯上有著驚人的相似之處。防抖與節流、鏈表與樹&#xff0c;這兩組分屬不同領域的概念&#xff0c;正是這種思維共性的典型代表。它們不僅展…

第三階段數據-3:數據庫腳本生成,備份與還原,分離與附加

1_生成數據庫腳本&#xff08;1&#xff09;在數據庫上右鍵選擇任務&#xff08;2&#xff09;選擇生成腳本&#xff08;3&#xff09;選擇下一步&#xff0c;如果下次不想顯示此頁面&#xff0c;可勾選不再顯示此頁&#xff08;4&#xff09;如果導出全部數據&#xff0c;選擇…

React框架超詳細入門到實戰項目演練【前端】【React】

React框架 1.前端展示解釋 當客戶端訪問服務器時&#xff0c;會從服務器中下載很多靜態文件到本地&#xff0c;比如css、js等前端渲染文件 下載完成之后瀏覽器會將這些文件組合形成前端頁面渲染出來。 2.React概述 React是一個專注于構建用戶界面的JavaScript庫&#xff0c;…

本地部署的終極多面手:Qwen2.5-Omni-3B,視頻剪、音頻混、圖像生、文本寫全搞定

Qwen2.5-Omni-3B是什么&#xff1f; Qwen2.5-Omni-3B 是由阿里巴巴 Qwen 團隊推出的一款輕量級多模態大模型&#xff0c;作為 Qwen2.5-Omni-7B 的高效優化版本&#xff0c;專為消費級硬件環境量身打造。該模型具備處理文本、音頻、圖像和視頻等多種模態輸入的能力&#xff0c;…

連續空間強化學習:策略輸出的兩種形態 —— 概率分布與確定性動作

在強化學習的世界里&#xff0c;智能體與環境的交互核心是 “動作選擇”。當面對離散動作空間&#xff08;如圍棋的落子點、游戲的按鍵操作&#xff09;時&#xff0c;智能體可以直接枚舉或概率選擇有限的動作&#xff1b;但在連續動作空間中&#xff08;如機器人關節角度、無人…

IT運維背鍋權限泄露?集中式管控如何化解風險?

在企業數字化轉型的浪潮中&#xff0c;IT運維團隊常常被推到風口浪尖。員工離職后權限未及時回收、賬號共享導致數據泄露、跨系統權限配置不一致……這些問題一旦暴露&#xff0c;IT運維往往成為“背鍋俠”。權限泄露不僅威脅企業數據安全&#xff0c;還可能導致合規性風險&…

2025 世界機器人大會啟示錄:機構學 × AI × 視頻鏈路的融合之路

引言 2025 年 8 月 8 日&#xff0c;北京再一次成為全球矚目的科技焦點——世界機器人大會盛大開幕。來自全球的 200 余家頂尖企業齊聚一堂&#xff0c;帶來超過 1500 件展品&#xff0c;其中首發新品突破 100 款&#xff0c;涵蓋了從工業制造、醫療康復到服務陪伴、特種作業的…