SpringCloud搭建保姆级教程
一、搭建服务注册与发现中⼼
使⽤Spring Cloud Netflix 中的 Eureka 搭建服务注册与发现中⼼
1、创建SpringBoot应用添加依赖
1、spring web2、eureka server
2、配置服务注册与发现中⼼
## 设置服务注册与发现中⼼的端⼝
server:
port: 8761
## 在微服务架构中,服务注册中⼼是通过服务应⽤的名称来区分每个服务的
## 我们在创建每个服务之后,指定当前服务的 应⽤名/项⽬名
spring:
application: null
name: service-eureka
eureka:
client:
## ip 就是服务注册中⼼服务器的ip,port 就是服务注册与发现中⼼设置的port
service-url:
defaultZone: 'http://192.168.54.59:8761/eureka'
## 设置服务注册与发现中⼼是否为为集群搭建(如果为集群模式,多个eureka节点之间需要相互注册)
register-with-eureka: false
## 设置服务注册与发现中是否作为服务进⾏注册
fetch-registry: false
3、在启动类添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class ServiceEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceEurekaApplication.class, args);
}
}
4、运⾏及访问
二、服务注册
创建保存订单的服务(order-add)注册到服务注册与发现中⼼
1、创建SpringBoot应⽤
创建spring boot应⽤,完成功能开发
2、注册服务
将能够完成特定业务的SpringBoot应⽤作为服务提供者,注册到服务注册与发现中⼼
2.1、添加依赖eureka-server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2、配置application.yml
server:
port: 9001
## 当前应⽤名会作为服务唯⼀标识注册到eureka
spring:
application:
name: order-add
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: 'jdbc:mysql://localhost:3306/db_2010_sc?characterEncoding=utf-8'
username: root
password: admin123
mybatis:
mapper-locations: 'classpath:mappers/*'
type-aliases-package: com.qfedu.order.beans
## 配置Eureka服务注册与发现中⼼的地址
eureka:
client:
service-url:
defaultZone: 'http://localhost:8761/eureka'
2.3、在当前服务应⽤的启动类添加 @EnableEurekaClient 注解
@SpringBootApplication
@MapperScan("com.qfedu.order.dao")
@EnableEurekaClient
public class OrderAddApplication {
public static void main(String[] args) {
SpringApplication.run(OrderAddApplication.class, args);
}
}
三、服务发现-Ribbon
服务消费者(api-order-add)通过eureka查找服务提供者(order-add),通过服务调⽤组件调⽤提供者
- eureka server
- ribbon
1、基础配置
Ribbon客户端已经停更进维啦
1.1、创建SpringBoot应⽤,添加依赖
- eureka server
- ribbon
1.2、配置application.yml
server:
port: 8001
spring:
application:
name: api-order-add
eureka:
client:
service-url:
defaultZone: 'http://localhost:8761/eureka'
1.3、在启动类添加 @EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class ApiOrderAddApplication {
public static void main(String[] args) {
SpringApplication.run(ApiOrderAddApplication.class, args);
}
}
2、服务调⽤
2.1、配置RestTemplate
@Configuration
public class AppConfig {
@LoadBalanced //启⽤Ribbon(负载均衡)
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
2.2、在Service中注⼊RestTemplate对象调⽤服务
@Service
public class OrderAddServiceImpl implements OrderAddService {
@Autowired
private RestTemplate restTemplate;
@Override
public ResultVO saveOrder(Order order) {
//1. 调⽤ order-add服务进⾏保存
ResultVO vo = restTemplate.postForObject("http://order-add/order/add", order, ResultVO.class);
//2. 调⽤ orderitem-add 保存订单快照
//3. 调⽤ stock-update 修改商品库存
//4. 调⽤ shopcart-del 删除购物⻋记录
return null;
}
}
3、Ribbon服务调⽤说明
@LoadBalanced注解是Ribbon的⼊⼝,在RestTemplate对象上添加此注解之后,再使⽤RestTemplate发送REST请求的时候,就可以通过Ribbon根据服务名称从Eureka中查找服务对应的访问地址列表,再根据负载均衡策略(默认轮询)选择其中的⼀个,然后完成服务的调⽤
- 获取服务列表
- 根据负载均衡策略选择服务
- 完成服务调⽤
四、基于Ribbon进⾏服务调⽤的参数传递
1、RestTemplate发送调⽤请求的⽅法
SpringCloud的服务调⽤是基于REST的,因此当服务提供者规定了请求的⽅式,服务消费者必须发送对应⽅式的请求才能完成服务的调⽤,RestTemplate提供了多个⽅法⽤于发送不同形式的请求。
//post⽅式请求
restTemplate.postForObject();
//get⽅式请求
restTemplate.getForObject();
//delete⽅式请求
restTemplate.delete();
//put⽅式请求
restTemplate.put();
2、put/post请求传参
//参数1:访问服务的url
//参数2:传递的对象参数
//参数3:指定服务提供者返回的数据类型
ResultVO vo = restTemplate.postForObject("http://order-add/order/add",order, ResultVO.class);
2、服务提供者接收参数
@PostMapping("/add")
public ResultVO addOrder(@RequestBody Order order){
return orderService.saveOrder(order);
}
3、get请求传参
1、服务消费者请求传参
String userId = order.getUserId();
ResultVO vo = restTemplate.getForObject("http://order-add/order/add?userId="+userId, ResultVO.class);
2、服务提供者接收参数
@GetMapping("/add")
public ResultVO addOrder(Order order){
return orderService.saveOrder(order);
}
@GetMapping("/add")
public ResultVO addOrder(String userId){
//return orderService.saveOrder(order);
}
五、服务发现-Feign
1、基础配置
1.1、创建SpringBoot应⽤,添加依赖
spring webeureka serverOpenFeign
1.2、配置application.yml
server:
port: 8002
spring:
application:
name: api-order-add-feign
eureka:
client:
service-url:
defaultZone: 'http://localhost:8761/eureka'
1.3、在启动类添加注解
@SpringBootApplication
@EnableDiscoveryClient //声明为服务消费者
@EnableFeignClients //声明启⽤feign客户端
public class ApiOrderAddFeignApplication {
public static void main(String[] args) {
SpringApplication.run(ApiOrderAddFeignApplication.class, args);
}
}
2、服务调⽤
使⽤Feign进⾏服务调⽤的时候,需要⼿动创建⼀个服务访问客户端(接⼝)
2.1、创建Feign客户端
@FeignClient("order-add")
public interface OrderAddClient {
@PostMapping("order/add")
public ResultVO addOrder(Order order);
}
2.2、使⽤Feign客户端调⽤服务
@Service
public class OrderAddServiceImpl implements OrderAddService {
@Autowired
private OrderAddClient orderAddClient;
@Override
public ResultVO saveOrder(Order order) {
//1. 调⽤ order-add服务进⾏保存
ResultVO vo = orderAddClient.addOrder(order);
//2. 调⽤ orderitem-add 保存订单快照
//3. 调⽤ stock-update 修改商品库存
//4. 调⽤ shopcart-del 删除购物⻋记录
return vo;
}
}
3、Feign传参
3.1、POST请求
1、通过请求体传递对象
服务提供者@PostMapping("/add")
public ResultVO addOrder(@RequestBody Order order){
System.out.println("-------------------order-add");
System.out.println(order);
return orderService.saveOrder(order);
}服务消费者(Feign客户端)@FeignClient("order-add")
public interface OrderAddClient {
@PostMapping("order/add")
public ResultVO addOrder(Order order);
}
2、通过请求⾏传参
服务提供者@PostMapping("/add")
public ResultVO addOrder(@RequestBody Order order,String str){
System.out.println("-------------------order-add");
System.out.println(order);
System.out.println(str);
return orderService.saveOrder(order);
}服务消费者(Feign客户端)//1.对⽤POST请求调⽤服务,Feign客户端的⽅法参数默认为body传值(body只能有⼀个值)
//2.如果有多个参数,则需要通过@RequestParam声明参数为请求⾏传值
@PostMapping("order/add")
public ResultVO addOrder(Order order,@RequestParam("str") String str);
3、Get请求
Get请求调⽤服务,只能通过url传参在Feign客户端的⽅法中,如果不指定参数的传值⽅式,则默认为body传参,Get请求也不例外;因此对于get请求传递参数,必须通过@RequestParam注解声明
服务提供者@GetMapping("/get")
public Order addOrder(String orderId){
return new Order();
}服务消费者(Feign客户端)@GetMapping("order/get")
public Order getOrder(@RequestParam("orderId") String orderId);
六、服务注册与发现中⼼的可靠性和安全性
1、可靠性
在微服务架构系统中,服务消费者是通过服务注册与发现中⼼发现服务、调⽤服务的,服务注册与发现中⼼服务器⼀旦挂掉,将会导致整个微服务架构系统的崩溃,如何保证Eureka的可靠性呢?
- 使⽤eureka集群
相互注册、相互发现
## 设置服务注册与发现中⼼的端⼝
server:
port: 8761
## 在微服务架构中,服务注册中⼼是通过服务应⽤的名称来区分每个服务的
## 我们在创建每个服务之后,指定当前服务的 应⽤名/项⽬名
spring:
application:
name: service-eureka
eureka:
client:
## 设置服务注册与发现中⼼是否为集群搭建
register-with-eureka: true
## 设置服务注册与发现中是否作为服务进⾏注册
fetch-registry: true
## ip 就是服务注册中⼼服务器的ip
## port 就是服务注册与发现中⼼设置的port
service-url:
defaultZone: 'http://192.168.54.10:8761/eureka'
2、安全性
当完成Eureka的搭建之后,只要知道ip和port就可以随意的注册服务、调⽤服务,这是不安全的,我们可以通过设置帐号和密码来限制服务的注册及发现。
- 在eureka中整合Spring Security安全框架实现帐号和密码验证
2.1、添加SpringSecurity的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.2、设置访问eureka的帐号和密码
spring:
security:
user:
name: zhangsan
password: 123456
2.3、配置Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
// 设置当前服务器的所有请求都要使⽤spring security的认证
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
2.4、服务提供者和服务消费者连接到注册中⼼都要帐号和密码
eureka:
client:
service-url:
defaultZone: 'http://zhangsan:123456@localhost:8761/eureka'
七、熔断器-Hystrix
服务故障的雪崩效应:当A服务调⽤B服务时,由于B服务的故障导致A服务处于阻塞状态,当量的请求可能会导致A服务因资源耗尽⽽出现故障。
1、熔断器介绍
1、服务降级 :⽤户请求A服务,A服务调⽤B服务,当B服务出现故障或者在特定的时间段内不能给A服务响应,为了避免A服务因等待B服务⽽产⽣阻塞,A服务就不等B服务的结果了,直接给⽤户⼀个降级响应2、服务熔断 :⽤户请求A服务,A服务调⽤B服务,当B服务出现故障的频率过⾼达到特定阈值(5s 20次)时,当⽤户再请求A服务时,A服务将不再调⽤B服务,直接给⽤户⼀个降级响应
2、熔断器的原理
3、基于Ribbon服务调⽤的熔断器使⽤
3.1、服务消费者的服务降级
1、添加熔断器依赖 hystrix
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>2、在启动类添加 @EnableHystrix 注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ApiOrderAddApplication {
public static void main(String[] args) {
SpringApplication.run(ApiOrderAddApplication.class, args);
}
}3、在调⽤服务提供者的业务处理⽅法中,进⾏降级配置
@Service
public class OrderAddServiceImpl implements OrderAddService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod ="fallbackSaveOrder",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
}
)
public ResultVO saveOrder(Order order) {
//1. 调⽤ order-add服务进⾏保存
//参数1:访问服务的url
//参数2:传递的对象参数
//参数3:指定服务提供者返回的数据类型
ResultVO vo = restTemplate.postForObject("http://order-add/order/add",order, ResultVO.class);
System.out.println(vo);
return vo;
}
/**
* 降级⽅法:与业务⽅法拥有相同的参数和返回值
* @return
*/
public ResultVO fallbackSaveOrder(Order order){
return ResultVO.fail("⽹络异常,请重试!",null);
}
}
3.2、服务提供者的服务降级
1、配置步骤⼀致2、服务提供者接⼝降级
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@HystrixCommand(fallbackMethod ="fallbackAddOrder",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
}
)
@PostMapping("/add")
public ResultVO addOrder(@RequestBody Order order){
System.out.println("-------------------order-add");
System.out.println(order);
try {
Thread.sleep(5000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
return orderService.saveOrder(order);
}
public ResultVO fallbackAddOrder(@RequestBody Order order){
System.out.println("-------------------order-add--fallback");
return ResultVO.fail("订单保存失败!",null);
}
}
1、服务熔断配置
熔断器状态:闭合、打开、半开服务熔断配置@HystrixCommand(fallbackMethod ="fallbackSaveOrder",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000"),
@HystrixProperty(name="circuitBreaker.enabled",value="true"),//启⽤服务熔断
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="10000"),//时间
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="10"),//请求次数
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="50"),//服务错误率
}
)
public ResultVO saveOrder(Order order) {
//1. 调⽤ order-add服务进⾏保存
ResultVO vo = restTemplate.postForObject("http://orderadd/order/add", order, ResultVO.class);
System.out.println(vo);
return vo;
}
/**
* 降级⽅法:与业务⽅法拥有相同的参数和返回值
* @return
*/
public ResultVO fallbackSaveOrder(Order order){
return ResultVO.fail("⽹络异常,请重试!",null);
}服务熔断:当⽤户请求服务A,服务A调⽤服务B时,如果服务B的故障率达到特定的阈值时,熔断器就会被打开⼀个时间周期(默认5s,可⾃定义),在这个时间周期内如果⽤户请求服务A,服务A将不再调⽤服务B,⽽是直接响应降级服务。
4、基于Feign服务调⽤的熔断器使⽤
Feign是基于Ribbon和Hystrix的封装
4.1、Feign中的熔断器使⽤
1、添加依赖(SpringBoot 2.3.11 、Spring Cloud H)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
</properties><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>2、在application.yml启⽤熔断器机制
feign:
hystrix:
enabled: true3、在启动类添加 @EnableHystrix
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class ApiOrderAddFeignApplication {
public static void main(String[] args) {
SpringApplication.run(ApiOrderAddFeignApplication.class, args);
}
}4、创建服务降级处理类
5、FeignClient的服务降级类:
5.1.必须实现Feign客户端接⼝
5.2.必须交给Spring容器管理
@Component
public class OrderAddClientFallback implements OrderAddClient {
public ResultVO addOrder(Order order, String str) {
System.out.println("-------addOrder的降级服务");
return ResultVO.fail("fail",null);
}
public Order getOrder(String orderId) {
System.out.println("-------getOrder的降级服务");
return new Order();
}
}6、在Feign客户端指定降级处理类
@FeignClient(value = "order-add", fallback =OrderAddClientFallback.class)
public interface OrderAddClient {
//1.对⽤POST请求调⽤服务,Feign客户端的⽅法参数默认为body传值(body只能有⼀个值)
//2.如果有多个参数,则需要通过@RequestParam声明参数为请求⾏传值
@PostMapping("order/add")
public ResultVO addOrder(Order order,@RequestParam("str") String str);
@GetMapping("order/get")
public Order getOrder(@RequestParam("orderId") String orderId);
}7、Service类通过Feign客户端调⽤服务
@Service
public class OrderAddServiceImpl implements OrderAddService {
@Autowired
private OrderAddClient orderAddClient;
//当我们创建Feign客户端的降级类并交给Spring管理后 在Spring容器中就会出现两个OrderAddClient对象
@Override
public ResultVO saveOrder(Order order) {
//1. 调⽤ order-add服务进⾏保存
ResultVO vo = orderAddClient.addOrder(order,"测试字符串");
Order order1 = orderAddClient.getOrder("订单编号");
System.out.println(order1);
return vo;
}
}
5、Ribbon 参数配置
ribbon:
## Ribbon建⽴连接最⼤等待时间
ConnectTimeout: 1000
## 在当前服务提供者尝试连接次数
MaxAutoRetries: 2
## 与服务提供者通信时间
ReadTimeout: 5000 ## 设置熔断器服务降级时间 (默认 1000)
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 8000
6、熔断器仪表盘监控
查看各个服务的熔断器状态面板:
- 熔断器仪表盘
6.1、搭建熔断器仪表盘
1、创建SpringBoot项⽬,添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrixdashboard</artifactId>
</dependency>2、配置仪表盘的port和appName
server:
port: 9999
spring:
application:
name: hystrix-dashboard
hystrix:
dashboard:
proxy-stream-allow-list: localhost3、启动类添加 @EanbleHystrixDashboard 注解
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardApplication.class,args);
}
}4、访问 http://localhost:9999/hystrix
6.2、配置使⽤了熔断器的服务可被监控
1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>2、配置(给每个需要监控熔断器的项目配置)
@Configuration
public class DashBoardConfig {
@Bean
public ServletRegistrationBean getServletRegistrationBean(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setName("HystrixMetricsStreamServlet");
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
return registrationBean;
}
}3、查看指定服务的熔断器⼯作参数
SpringCloud搭建保姆级教程的更多相关文章
- 强大博客搭建全过程(1)-hexo博客搭建保姆级教程
1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...
- renren-fast-vue人人开源前端项目搭建保姆级教程
1.从gitee上clone项目 git clone https://gitee.com/renrenio/renren-fast-vue.git 2.准备好python环境 需要有Python2以上 ...
- 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)
写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...
- 自建本地服务器,自建Web服务器——保姆级教程!
搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...
- RocketMQ保姆级教程
大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...
- Eclipse for C/C++ 开发环境部署保姆级教程
Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...
- API网关才是大势所趋?SpringCloud Gateway保姆级入门教程
什么是微服务网关 SpringCloud Gateway是Spring全家桶中一个比较新的项目,Spring社区是这么介绍它的: 该项目借助Spring WebFlux的能力,打造了一个API网关.旨 ...
- 保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话
导读 在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键.但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务 ...
- 保姆级教程,带你认识大数据,从0到1搭建 Hadoop 集群
大数据简介,概念部分 概念部分,建议之前没有任何大数据相关知识的朋友阅读 大数据概论 什么是大数据 大数据(Big Data)是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需 ...
- vue-cli环境搭建 (超详细保姆级教程)
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...
随机推荐
- 从源码角度剖析 golang 如何fork一个进程
从源码角度剖析 golang 如何fork一个进程 创建一个新进程分为两个步骤,一个是fork系统调用,一个是execve 系统调用,fork调用会复用父进程的堆栈,而execve直接覆盖当前进程的堆 ...
- 【Python&RS】遥感影像的像素坐标转地理坐标(仿射变换)
GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库.它利用抽象数据模型来表达所支持的各种文件格式 ...
- NSDI-2023 微软论文:解构有状态网络功能
本文通过chatgpt代理站(支持gpt4):gptschools.cn翻译整理 微软Azure对每个虚拟机进行了为期三个月的网络监控,获得了新建.并发.PPS等指标情况,发现: 1) 网络功能负载不 ...
- 解决MySQL自动弹出命令行窗口
自从装了MySQL之后,我的电脑就会在某些时刻弹出一个黑乎乎的命令行窗口,然后立马消失.一开始还以为是电脑出了什么故障,但一直没有出现其他什么问题,就是玩游戏时弹出来有点难受.有一次我眼睛看到了一闪而 ...
- 【HarmonyOS】HarmonyOS应用APP与HAP包签名信息查看方法
HarmonyOS可以通过DevEco Studio 构建对应的APP包或者是HAP包,对于签名我们有两种方式: DevEco Studio提供了根据开发者信息生成自动调试签名的能力方便各位开发者进 ...
- C++容器(vector、deque、list、map)
(1) vector:将元素置于一个动态数组中,可以随机存储元素(也就是用索引直接存取). 数组尾部添加或删除元素非常迅速.但在中部或头部就比较费时. *代码演示:* 取: at在下标越界时会抛出异常 ...
- 鸟类识别系统Python+Django+TensorFlow+卷积神经网络算法【完整代码】
一.介绍 鸟类识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法.并通过对数据集进行训练,最后得到一个识别精度较高的模型.并基于Django框架,开 ...
- JavaCV人脸识别三部曲之三:识别和预览
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <JavaCV人脸识别三部曲>链接 < ...
- SQL SERVER 查看表说明,字段属性
查询表字段属性,说明等: 1 SELECT 2 表名=case when a.colorder=1 then d.name else '' end, 3 表说明=case when a.colorde ...
- 【笔试实战】LeetCode题单刷题-编程基础 0 到 1【三】
682. 棒球比赛 题目链接 682. 棒球比赛 题目描述 你现在是一场采用特殊赛制棒球比赛的记录员.这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分. 比赛开始时,记录是空白的.你 ...