前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot2新版升级springcloud微服务实战Consul+sleuth+zipkin+Feign/Ribbon+Config+Zuul+Hystrix+Turbine

springboot2新版升级springcloud微服务实战Consul+sleuth+zipkin+Feign/Ribbon+Config+Zuul+Hystrix+Turbine

作者头像
码农笔录
发布于 2022-01-21 06:33:48
发布于 2022-01-21 06:33:48
71610
代码可运行
举报
文章被收录于专栏:码农笔录码农笔录
运行总次数:0
代码可运行

sb2.0新版springcloud微服务实战:Consul+Zuul+Feign/Ribbon+Hystrix Turbine+SpringCloundConfig+sleuth+zipkin

springboot 版本是 2.0.3.RELEASE ,springcloud 版本是 Finchley.RELEASE

aiprose 个人随笔上线,网址 aiprose.com 点击访问

本篇文章是springboot2.x升级后的升级springcloud专贴,因为之前版本更新已经好久了,好多人评论可不可以出个新版本,大家一定要注意,这是springboot2.x版本的,springboot1.x的请参考 点击查看文章,基本组件都不变就是升级jar包版本,主要就是hystrix-dashboard使用有点变化。

相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展。会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新建的项目都是用springboot,附源码下载,推荐使用coding地址下载,因为可以切换分支,后期可以及时更新。

coding仓库地址(推荐下载): coding地址 远程配置仓库地址 远程配置仓库地址

如果有问题请在下边评论,或者200909980加群交流。或者关注文章结尾微信公众号,私信后台

Eureka/Consul/Zookeeper:服务发现 Hystrix:断路器 Zuul:智能路由 Ribbon/Feign:客户端负载均衡 (Feign用的更多) Turbine&hystrix-dashboard:集群监控 Springcloud-config:远程获取配置文件

接下来,我们开始搭建项目,首先我们到spring为我们提供的一个网站快速搭建springboot项目,点击访问,我这里用的是gradle,如果各位客官喜欢用maven,好吧你可以到http://mvnrepository.com/查看对应的依赖,点我访问

一、搭建consul服务

使用 eureka 作为服务发现 请参考点击查看使用eureka作为服务注册中心

springclound-consul作为服务发现的核心,第一个搭建,后面的服务都要注册到consul上,意思是告诉consul自己的服务地址是啥。当然还可以用zookeeper或者eureka。

  • 1下载安装consul consul的下载地址consul下载地址,根据自己电脑系统下载对应的包。 我这里是windows64,网上说要配置环境变量,就可以直接使用,但是我这里不行。具体方法是,下载解压后是一个.exe可执行文件,然后配置当前路劲到path中,然后直接在cmd命令窗口中,输入consul agent -dev 就可以启动了,如果不行的话,就在cmd命令窗口进如到consul的下载目录,然后执行上面的命令。然后consul的默认端口是8500,直接在浏览器打开http://localhost:8500,就可以看到控制台了

二、搭建config-server服务sc-config-server

springcloud-config-server是用来将远程git仓库的配置文件动态拉下来,这样配置文件就可以动态的维护了。当然也可以选择本地仓库。

新建一个springboot项目,修改maven私服地址,并加入一下依赖。

  • 1.修改build.gradle文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile('org.springframework.cloud:spring-cloud-config-server')
compile('org.springframework.cloud:spring-cloud-starter-consul-discovery')
//连接config-server也需要用户名和密码
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-actuator')
  • 2.修改application.yml文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 8800
spring:
  security:
    basic:
      enabled: true
    user:
      name: root
      password: booszy
  application:
    name: sc-config-server
  cloud:
    config:
      server:
        git:
          uri: https://git.coding.net/yirenyishi/springcloud-config-profile
          searchPaths: '{application}'
    consul:
      host: localhost
      port: 8500
      discovery:
        instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
        ip-address: true
  • 3.修改启动类

修改启动类,要加入这三个注解,因为要注册到consul上,所以需要@EnableDiscoveryClient这个注解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class Sb2scConfigApplication {
	public static void main(String[] args) {
		SpringApplication.run(Sb2scConfigApplication.class, args);
	}
}

然后运行启动springboot项目,等启动成功后访问consul的页面,会发现sc-config-server已经注册到上面了,如果启动报错,请检查错误信息。

三、搭建服务提供者服务sc-provider

编写一个服务提供者,为下边的消费者提供服务,用到了spring-webflux(spring新出的非阻塞式框架)不是springmvc,当然你们公司用什么你还是继续用什么。

  • 注意 : 这里除了application.xml,还需要一个bootstrap.yml, 因为bootstrap.yml得加载顺序是在application.xml前边,服务注册和config配置必须放到bootstrap.yml。
    1. 修改build.gradle文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile('org.springframework.cloud:spring-cloud-starter-consul-discovery')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-actuator')
  • 2.编写配置文件bootstrap.yml

** 注意 : 这里除了application.xml,还需要一个bootstrap.yml*

application.xml我是放到远程仓库地址的,大家可以直接到我的远程仓库,根据项目名(sc-provider-config)查询。配置文件的仓库地址:点击访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  application:
    name: sc-provider
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
      instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
      ip-address: true
    config:
      discovery:
        enabled: true
        service-id: sc-config-server
      fail-fast: true
      username: root
      password: booszy
      profile: csdn
  • 3.编写代码

编写主类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableDiscoveryClient
@SpringBootApplication
public class Sb2scProviderApplication {
	public static void main(String[] args) {
		SpringApplication.run(Sb2scProviderApplication.class, args);
	}
}

新建IndexController进行测试,这里只是为了测试,案例代码使用的是webflux,如果想使用springmvc,修改jar包依赖即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@RequestMapping("test")
public class IndexController {
	//返回一个实体
    @GetMapping("{msg}")
    public Mono<String> sayHelloWorld(@PathVariable("msg") String msg) {
        System.out.println("come on " + msg);
        return Mono.just("sc-provider receive : " +msg);
    }
	//返回一个列表
    @GetMapping("list")
    public Flux<Integer> list() {
        List<Integer> list = new ArrayList<>();
        list.add(8);
        list.add(22);
        list.add(75);
        list.add(93);
        Flux<Integer> userFlux = Flux.fromIterable(list);
        return userFlux;
    }
}

运行springboot项目,去consul查看,有没有注册上。

我们的sc-provider已经注册到consul上了,访问接口,成功。

四、搭建消费者服务sc-consumer

消费者要访问服务提供者的服务,这里用的是通过RestTemplate/feign请求resetful接口,使用ribbon做客户端负载均衡,hystrix做错误处理,feign和ribbon二选一,案例中ribbon和feign都有,也可以都用。 还是熟悉的配方,熟悉的味道,新建springboot项目,添加项目依赖。

  • 1.修改build.gradle文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile('org.springframework.cloud:spring-cloud-starter-consul-discovery')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.cloud:spring-cloud-starter-openfeign')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix')
  • 2.修改bootstrap.yml文件

application.yml 在git仓库,请前往git仓库查看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  application:
    name: sc-consumer
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
      instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
      ip-address: true
    config:
      discovery:
        enabled: true
        service-id: sc-config-server
      fail-fast: true
      username: root
      password: booszy
      profile: csdn
#新版配置,否则后面dashboard无法找到hystrix.stream
management:
  endpoints:
    web:
      exposure:
        include: '*'
  • 3.编写代码

启动类代码

@RibbonClient 指定服务使用的负载均衡类型,name不指定服务则为所有的服务打开负载均衡,也可以在用yml中进行配置。 @EnableHystrix 是支持hystrix打开断路器,在规定时间内失败参数超过一定参数,就会打开断路器,不会发起请求,而是直接进入到错误处理方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrix
@SpringBootApplication
public class Sb2scConsumerApplication {
	// ribbon需要配置,负载均衡
	@Autowired
	private RestTemplateBuilder builder;

	// ribbon需要配置,负载均衡
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return builder.build();
	}
	public static void main(String[] args) {
		SpringApplication.run(Sb2scConsumerApplication.class, args);
	}
}
1.ribbon案例

ribbon不需要单独依赖,新建 RibbonController ribbon一个坑,不能接受List类型,要使用数组接收。 @HystrixCommand(fallbackMethod=“fallbackMethod”) 如果请求失败,会进入fallbackMethod这个方法,fallbackMethod这个方法要求参数和返回值与回调他的方法保持一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class RibbonController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/ribbon/{wd}")
    @HystrixCommand(fallbackMethod="fallbackMethod")
    public Mono<String> sayHelloWorld(@PathVariable("wd") String parm) {
        String res = this.restTemplate.getForObject("http://sc-provider/test/" + parm, String.class);
        return Mono.just(res);
    }

    public Mono<String> fallbackMethod(@PathVariable("wd") String parm) {
        return Mono.just("fallback");
    }

运行springboot项目,先看有没有注册到consul上。

注册成功后,访问接口,测试是否正确。

ribbon使用就是这么简单,ribbon是springboot自带,所以不需要单独添加依赖。

2.feign案例

在实际开发中,feign使用的还是挺多的,feign底层还是使用了ribbon。废话不多说,直接上步骤,在服务消费者中使用feign访问服务提供者。

  • 1配置文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ribbon:
  ReadTimeout:  30000
  ConnectTimeout:  15000
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 10000

feign的默认请求超时时间是1s,所以经常会出现超时的问题,这里我设置的是10s。ribbon的请求时间也要设置,因为feign用的是ribbon。这里贴的是application.yml文件中的一小段

  • 2 编码

1、主类注解

@EnableFeignClients @EnableCircuitBreaker @EnableHystrix

这三个都要,hystrix主要作用是断路器,会进如fein的fallback中。 主类代码在上面已经贴出来了

2、编写feign接口,MFeignClient.class

name是指要请求的服务名称。这里请求的是服务提供者 fallback 是指请求失败,进入断路器的类,和使用ribbon是一样的。 configuration 是feign的一些配置,例如编码器等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@FeignClient(name = "sc-provider",fallback = MFeignClientFallback.class, configuration = MFeignConfig.class)
public interface MFeignClient {
    // 这是被请求微服务的地址,也就是provider的地址
    @GetMapping(value = "/test/{msg}")
    String sayHelloWorld(@PathVariable("msg") String msg);

    @GetMapping(value = "/test/list")
    List<Integer> list();

    @GetMapping(value = "/test/list")
    Integer[] array();
}
  • 3 MFeignConfig.class feign的配置

这里配置了feign的打印日志等级

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class MFeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
  • 4 MFeignClientFallback.class ,断路器回调方法

断路器要实现上边定义的MFeignClient接口,请求失败,进入断路器时,会回调这里的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class MFeignClientFallback implements MFeignClient{
    @Override
    public String sayHelloWorld(String msg) {
        return "fallback";
    }

    @Override
    public List<Integer> list() {
        return new ArrayList<>();
    }

    @Override
    public Integer[] array() {
        return new Integer[0];
    }
}
  • 5 在controller中使用feign
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class FeignController {

    @Autowired
    private MFeignClient feignClient;

    @GetMapping("/feign/{wd}")
    public Mono<String> sayHelloWorld(@PathVariable("wd") String parm) {
        String result = feignClient.sayHelloWorld(parm);
        return Mono.just(result);
    }

    @GetMapping("/feign/list")
    public Flux<Integer> list() {
        List<Integer> list = feignClient.list();
        Flux<Integer> userFlux = Flux.fromIterable(list);
        return userFlux;
    }

    @GetMapping("/feign/array")
    public Flux<Integer> array() {
        Integer[] arrays = feignClient.array();
        Flux<Integer> userFlux = Flux.fromArray(arrays);
        return userFlux;
    }
}

五、用zuul做路由转发和负载均衡

这些微服务都是隐藏在后端的,用户是看不到,或者不是直接接触,可以用nginx或者zuul进行路由转发和负载均衡,zuul负载均衡默认用的是ribbon。

  • 1.修改build.gradle文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile('org.springframework.cloud:spring-cloud-starter-consul-discovery')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.cloud:spring-cloud-starter-netflix-zuul')
compile('org.springframework.boot:spring-boot-starter-actuator')
  • 2.修改bootstrap.yml

还是原来的配方,application.yml在git仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  application:
    name: sc-zuul
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
      instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
      ip-address: true
    config:
      discovery:
        enabled: true
        service-id: sc-config-server
      fail-fast: true
      username: root
      password: booszy
      profile: csdn
  • 3.启动类

@RefreshScope这个注解是当application.yml配置文件发生变化的时候,不需要手动的进行重启,调用localhost:8400/refresh,就会加载新的配置文件,当然正在访问的客户并不影响还是使用旧的配置文件,因为不是重启,后来的用户会使用新的配置文件。注意这块的刷新要用post请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableDiscoveryClient
@SpringBootApplication
@EnableZuulProxy
@RefreshScope
public class Sb2scZuulApplication {
	public static void main(String[] args) {
		SpringApplication.run(Sb2scZuulApplication.class, args);
	}
}

启动springboot项目,访问consul

这时候,我们就要通过zuul访问微服务了,而不是直接去访问微服务。 应该访问地址http://localhost:8400/sc-consumer/feign/list,这块你要换成你的zuul地址。

但是有些人就会说,这样以后用户请求会不会太长,比较反感,所以可以通过配置进行修改访问地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zuul:
  routes:
    springcloud-consumer-config: /consumer/**
    springcloud-provider-config: /provider/**

在application.yml中加入这样一段配置,其实就是nginx中的反向代理,使用一下简短的可以代理这个微服务。这个时候我们就可以这样去访问了http://localhost:8400/consumer/feign/list,是不是简短了很多

六、用hystrix-turbine-dashboard 做集群监控

项目在生产环境中,每个服务的访问量都不通,有些服务的访问量比较大,有时候有些服务挂了,不能继续服务,需要重启的时候,我们并不知道,所以这时候就需要使用hystrix-turbine-dashboard做一个监控,监控所有的微服务,可以看到这个接口实时访问量,和健康状况。 新建一个springboot项目,老套路,加入如下依赖

  • 1 添加依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile('org.springframework.cloud:spring-cloud-starter-consul-discovery')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard')
compile('org.springframework.cloud:spring-cloud-starter-netflix-turbine')

如果启动的时候报错要排除一下eureka依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
configurations {
	compile.exclude module: 'eureka-client'
}
  • 2 修改application.yml配置文件 注意:是application.yml,这里不需要bootstrap.yml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 8900
turbine:
  aggregator:
    clusterConfig: default
  appConfig: sc-consumer
  clusterNameExpression: "'default'"
spring:
  application:
    name: sc-dashboard
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
      instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
      ip-address: true

appConfig 后面是要检测的注册在consul上的服务名,必须要有

如果启动报错,找不到hystrix.stream,在你要监控的微服务加入如下配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management:
  endpoints:
    web:
      exposure:
        include: '*'
  • 3 修改主类

@EnableTurbine ,@EnableHystrixDashboard 一个都不能少

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableDiscoveryClient
@SpringBootApplication
@EnableTurbine
@EnableHystrixDashboard
public class Sb2scDashboardApplication {
	public static void main(String[] args) {
		SpringApplication.run(Sb2scDashboardApplication.class, args);
	}
}
  • 4 访问测试

这块的端口是8900,访问地址http://localhost:8900/hystrix,看到的是下面的页面。

然后在那个网址的输入框里输网址http://localhost:8900/turbine.stream,点击monitor stream。刚打开的时候可能是空的,什么也没有,这并不表示你已经错了。这时候你访问消费者服务的接口,例如访问http://localhost:8400/consumer/feign/list,多访问几次,然后看控制台有没有出现一个监控面板,没有就等会刷新一次,如果一直不出现,应该是配置有问题。

七、使用sleuth+zipkin 实现链路追踪服务

在使用微服务的时候,我们发现,有时候排错不好排查,所以就给大家整个这个链路追踪,很方便知道是哪一个服务调用哪一个服务出现了问题。因为有些项目可能服务比较多。

  • 1 添加依赖

新建一个springboot项目 虽然其他服务调用zipkin不是从consul上动态过去服务地址,而是硬编码,但是这块还是考虑吧zipkin注册到consul上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile('org.springframework.cloud:spring-cloud-starter-consul-discovery')
compile group: 'io.zipkin.java', name: 'zipkin-server', version: '2.9.3'
compile group: 'io.zipkin.java', name: 'zipkin-autoconfigure-ui', version: '2.9.3'
compile('org.springframework.boot:spring-boot-starter-actuator')

如果提示log4j有冲突,要排除依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
configurations {
	compile.exclude module: 'log4j'
	compile.exclude module: 'slf4j-log4j12'
	compile.exclude module: 'spring-boot-starter-logging'
}
  • 2 修改application配置文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 9411
spring:
  application:
    name: sc-sc-zipkin
  profiles:
    active: csdn
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
      instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
      ip-address: true
management:
  metrics:
    web:
      server:
        auto-time-requests: false
  • 3 主类注解添加

@EnableZipkinServer 主要是这个注解 启动服务后访问http://localhost:9411,就可以打开zipkin的控制台页面,这时候应该是什么都没有

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableDiscoveryClient
@SpringBootApplication
@EnableZipkinServer
public class Sb2scZipkinApplication {
	public static void main(String[] args) {
		SpringApplication.run(Sb2scZipkinApplication.class, args);
	}
}
  • 4 其他服务中调用

这里我们在消费者服务和提供者服务里都加入如下依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile('org.springframework.cloud:spring-cloud-starter-sleuth')
compile('org.springframework.cloud:spring-cloud-starter-zipkin')

然后修改配置文件,bootstrap.yml、 这块zipkin的地址是硬编码的,目前还没发现怎么从服务注册中心consul上动态获取,以后有解决方案,会更新帖子 sleuth这个是配置提取率,可以配置也可以不配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
      percentage: 1.0

启动服务,然后访问消费者服务的接口,这时候访问zipkin的控制台http://localhost:9411

点击依赖分析,可以看到调用服务链,因为这块只涉及到两个服务,所以只有两个,在实际生产环境中,这块可能有很多,到时候看起来就特别直观了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/08/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
我以为10呢
我以为10呢
回复回复点赞举报
推荐阅读
玩玩NAS、软路由,搭建家庭影音系统
我平时爱看一些高清电影,4k、HDR之类的,还有很多国内视频软件没有的电影。我媳妇也喜欢看剧,平时做饭的时候,都会用平板播放电视剧。所以我家对影音这块是有需求的。
Yuyy
2023/03/08
5.8K0
玩玩NAS、软路由,搭建家庭影音系统
《畅玩NAS》家庭 NAS 服务器搭建方案「建议收藏」
NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。目前国际著名的NAS企业有Netapp、EMC、OUO等。说白话,就是家用的服务器。
全栈程序员站长
2022/06/28
26.3K0
《畅玩NAS》家庭 NAS 服务器搭建方案「建议收藏」
宅男福利,如何搭建属于自己的家庭影院系统
作为一个程序员,一个宅男程序员,如何在家里愉悦地观看电影,愉悦地欣赏影视剧集是每个人的梦想。
程序那些事儿
2023/03/07
2.4K0
宅男福利,如何搭建属于自己的家庭影院系统
一文扫尽Nas常用Docker软件
NAS(Network Attached Storage,网络附加存储)设备上的Docker软件选择取决于您的具体需求和用途。以下是一些NAS上常用的Docker软件推荐:
你可以叫我可乐
2024/05/23
1.9K0
一文扫尽Nas常用Docker软件
NAS工具软件大盘点:瞧瞧哪个被你遗漏了
很多人都听说过NAS,也有很多人正在使用NAS,而NAS用户通常需要安装一些软件来扩展其功能,毕竟NAS的功能实在是太多了,光是部署与调试就要耗费大量的时间,
你可以叫我可乐
2024/08/01
9260
NAS工具软件大盘点:瞧瞧哪个被你遗漏了
NAS必备软件清单:提升存储效率与媒体管理
NAS(Network Attached Storage)用户通常需要安装一些软件来扩展其功能,以下软件支持各种系统,无论是群晖、威联通还是其他NAS设备,新手或者技术牛人都值得尝试。
你可以叫我可乐
2024/05/21
1K0
NAS必备软件清单:提升存储效率与媒体管理
OpenWrt应用场景:IPTV融合介绍
所谓iptv融合,就是将iptv和互联网融入到一起,实现任何设备(手机、电视、平板)在任何地点都能够观看家里运营商提供的iptv。
用户1160092
2024/11/12
1.9K0
OpenWrt应用场景:IPTV融合介绍
高性能视频播放器:Infuse for Mac中文版
Infuse Pro 是一款专为Mac设计的,能够轻松播放高质量视频播放器,可以利用 iCloud 多平台同步元数据、播放记录,而开发的软件实用程序。它提供了一个直观的用户界面和一个整洁干净的界面,支持所有流行的视频格式,如 MKV、MP4、AVI、ISO、DVD、BDMV 等。可以在一个中央库中同时显示来自多个来源的视频。让您浏览和播放存储在 Mac 上的视频。
快乐的小丸子
2022/11/18
1.3K0
Infuse for Mac(强大的视频播放器)7.4.7中文免激活版
Infuse PRO for Mac 是一款强大的视频播放器,几乎支持您的所有视频文件。Infuse 将把您从永无宁日的视频转换中解放出来,用极美的方式在您的Mac上观赏几乎所有视频格式。
一小朵
2022/11/03
1.4K0
Infuse for Mac(强大的视频播放器)7.4.7中文免激活版
Infuse Pro 7.5 Mac超强全能视频播放器 中文版
Infuse Pro 是一款强大的 Mac 视频播放器。它可以一口通吃您所有的视频文件 - Infuse 将把您从繁琐的视频转换中解放出来,用极美的方式在您的 Mac 上观赏几乎所有视频的格式。Infuse 已适配 macOS 11 并添加更加强大的在线视频,Trakt 同步,AirPlay 以及字幕功能。一切尽在随手掌控中。
用户1517359
2023/03/27
9560
《树莓派4B家庭服务器搭建指南》第十七期:树莓派配合性能更好的闲置笔记本搭建私人影院
Jellyfin是一款开源免费的私人影院(影音媒体管理)系统,可以帮我们把硬盘里的影视资源管理起来,并添加精美的海报.
zhaoolee
2023/07/11
1.5K0
《树莓派4B家庭服务器搭建指南》第十七期:树莓派配合性能更好的闲置笔记本搭建私人影院
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
无论你是 DevOps 运维工程师、自由开发者,还是需要远程办公、远程剪辑乃至远程教学的普通用户,一款兼顾 “远程桌面 + 文件传输 + 内网穿透 + 异地组网” 的工具都能让效率几何级跃升。
猫头虎
2025/05/22
6940
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
Plex Media Server本地搭建私人影音网站并实现远程访问
用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各种碎片时间(追剧下饭、地铁上刷剧等等),看个喜欢的视频必不可少。但不知道为什么,各大影音平台总能轮流占住热播剧,还限定很多剧只能会员观看,搞得我们总有交不完的会员费。此时,拥有一个私人影音媒体站点就显得很有必要。今天,笔者就为大家介绍,如何使用cpolar+Plex组合,在Windows系统上搭建一个全能的私人媒体影音站点。
是Nero哦
2024/01/18
5.2K0
Plex Media Server本地搭建私人影音网站并实现远程访问
一站式国产远程工具推荐:全面解析、深度对比与最佳选型指南
节点小宝集“内网穿透、异地组网、P2P 高速传输、深度 NAS 集成、端到端加密、安全审计”于一身,以行业领先的性能与体验,助力家庭智能化、企业数字化和开发者高效运维。
猫头虎
2025/06/01
2040
一站式国产远程工具推荐:全面解析、深度对比与最佳选型指南
小米路由器R2D开启SSH+Frp内网穿透,让爸妈在老家轻松追剧
家里小米电视就可以在路由器下的局域网里,播放下载好的电视剧和电影,让爸妈在家轻松追剧
yuanfan2012
2023/06/23
5.7K0
小米路由器R2D开启SSH+Frp内网穿透,让爸妈在老家轻松追剧
基于Emby搭建个人媒体库
Emby是一个媒体服务器软件,用于组织、管理和共享个人的音乐、电影、电视节目和其他媒体文件。它可以将您的媒体库中的内容流式传输到各种设备上,例如电脑、智能手机、平板电脑、智能电视等。
叔牙
2023/09/25
11.1K0
基于Emby搭建个人媒体库
简易家庭网络储存环境搭建
通常,我们会使用电脑上的本地硬盘和在线网盘来储存文件,然而本地硬盘有时候会出现容量太小的情况,而网盘则受限于网速,无法快速传输文件。并且,局域网内不同设备间的文件传输也成为了一大难题,这个时候,网络附加储存,也被称为NAS,显现出了它的优点。由于这类专业设备相对于移动硬盘、U盘等价格较贵,所以本文仅介绍如何以较低成本搭建简易家庭网络储存环境。
蒟蒻
2023/11/16
5821
简易家庭网络储存环境搭建
如何打造一个私人影音媒体库
你是否厌倦了视频软件中各种视频广告,你是否想要4K画质的观看体验,今天我们来打造一个低成本的私人影音库。
Lvshen
2022/05/05
2.4K0
如何打造一个私人影音媒体库
Infuse for Mac(强大的mac视频播放器)
Infuse for Mac是一款强大的mac视频播放器,可以在iPhone、iPad、Apple TV 和 Mac 上观看几乎任何视频格式的美妙方式。无需转换文件!Infuse 针对 macOS 11 进行了优化,具有强大的流媒体选项、Trakt 同步以及无与伦比的 AirPlay 和字幕支持。华丽的界面。精确控制。和如丝般流畅的播放。
Mac软件分享
2022/08/09
1.4K0
Infuse for Mac(强大的mac视频播放器)
借助树莓派上演“窃听风云”
但最近科技发展飞速,一般家庭宽带的网速已经达到了100M,同时手机的4G已经普及,5G也开始商用了(加油华为,加油China),在这样的环境下实现电影里面的窃听技术就比较容易得多了。
FB客服
2019/07/22
1.5K0
借助树莓派上演“窃听风云”
推荐阅读
相关推荐
玩玩NAS、软路由,搭建家庭影音系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验