首页 文章 精选 留言 我的

精选列表

搜索[全家桶],共2072篇文章
优秀的个人博客,低调大师

SpringBoot2全家桶,快速入门学习开发网站教程

说明 本系列文章带大家玩转SpringBoot2。 但是学习是一个循序渐进的过程,所以该文章将分为几个小章节讲述。 并且在学习SpringBoot之前需要一定的基础知识 SpringMVC、Spring、MyBatis基础知识 Maven MySQL、Redis 本文章代码建立的环境基础 注:由于环境不同可能会导致代码运行效果不同,请同步环境 开发环境 名称 版本 JDK jdk-12.0.2 IDE Eclipse2019.09 Databases MySQL_v8.0.18 SpringBoot v2.2.2 章节 1.SpringBoot2初体验 2.SpringBoot2编写第一个Co...

优秀的个人博客,低调大师

prometheus+ Grafana监控全家桶

在调研监控工具,之前一直用的zabbix很平稳(从没出过问题),监控内容大概有系统级别的cpu、内存、硬盘之类的, 也有服务的运行情况、elasticsearch、hive、kafka的lag等等,但有几个问题没法解决: 1、zabbix没法监控flink(虽然可以通过api调用方式,但flink指标有几百个一个一个加,并且zabbix机制为一个一个指标取的,极其麻烦和低效) 2、jvm级别的es、spring、kafka等运行情况不好获取 3、取kafka数据时,我们有n多topic对应又有n多groupid来消费,如果要取一遍所有信息,zabbix也是只能一个一个取(当然后边发现有模板的方式也可以,但如果增加一个也要手动加) 详细对比可以参考网上文章,说的很详细 http://dockone.io/article/10437 我理了下对于我们这种纯java+大数据场景,并且设备一般都在客户环境不能上网,随时会断电,情况下的优劣势 监控工具 优势 劣势 zabbix 稳定、进程少(一个server+agent搞定、文档齐全、所有操作界面都可以配、支持action动作触发(这个很重要) 对于docker、flink、hive等动态运行的场景支持不好(也可以自定义脚本搞定) prometheus 部署简单、社区插件比较多(各种exporter),比较多的官方直接支持 每增加一个组件的监控就需要一个exporter独立进程、预警action等页面不可配(本身页面功能特简陋) 放个普罗米修斯的架构图 其中: Prometheus Server: 用数据的采集和存储,PromQL查询,报警配置。 Push gateway: 用于批量,短期的监控数据的汇报总节点。 Exporters: 各种汇报数据的exporter,例如汇报机器数据的node_exporter,汇报MondogDB信息的 MongoDB_exporter 等等。 Alertmanager: 用于高级通知管理。 采集数据的主要流程如下: 1. Prometheus server 定期从静态配置的主机或服务发现的 targets 拉取数据(zookeeper,consul,DNS SRV Lookup等方式) 2. 当新拉取的数据大于配置内存缓存区的时候,Prometheus会将数据持久化到磁盘,也可以远程持久化到云端。 3. Prometheus通过PromQL、API、Console和其他可视化组件如Grafana、Promdash展示数据。 4. Prometheus 可以配置rules,然后定时查询数据,当条件触发的时候,会将告警推送到配置的Alertmanager。 5. Alertmanager收到告警的时候,会根据配置,聚合,去重,降噪,最后发出警告。 开始prometheus安装 他本身是用go写的,所以需要安装个go环境, 安装go: yum install epel-release yum install golang 安装普罗米修斯 下载 https://github.com/prometheus/prometheus/releases/tag/v2.26.0 tar zxvf prometheus-2.26.0.linux-amd64.tar.gz && cd prometheus-2.26.0.linux-amd64 ./prometheus --config.file=prometheus.yml 安装grafana vim /etc/yum.repos.d/grafana.repo [grafana] name=grafana baseurl=https://packages.grafana.com/oss/rpm repo_gpgcheck=1 enabled=1 gpgcheck=1 gpgkey=https://packages.grafana.com/gpg.key sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt 开始安装: yum install grafana -y systemctl start grafana-server systemctl enable grafana-server 这时候应该能访问grafana页面了: http://ip:3000 用户名密码 admin/admin 然后导入prometheus数据源 安装node_exporter 下载: https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz tar zxvf node_exporter-1.1.2.linux-amd64.tar.gz && cd node_exporter-1.1.2.linux-amd64 ./node_exporter # 启动node_exporter,默认是9100端口 修改普罗米修斯配置文件加入node_exporter数据获取 先关掉prometheus进程 ,修改 prometheus.yml ,在后边增加如下配置: - job_name: 'node_exporter_local' static_configs: - targets: ['127.0.0.1:9100'] 修改完之后重新执行 ./prometheus --config.file=prometheus.yml grafana 导入系统监控图 到grafana网站找到最新的一个node exporter图,点进去,可以看到get this dashboard的id,然后导入,数据源选择prometheus就可以看到效果了 https://grafana.com/grafana/dashboards/8919 增加es监控 [https://github.com/justwatchcom/elasticsearch_exporter](https://github.com/justwatchcom/elasticsearch_exporter) tar zxvf elasticsearch_exporter-1.1.0.linux-amd64.tar.gz cd elasticsearch_exporter-1.1.0.linux-amd64 # 启动es_exporter 默认监听端口为9114 ./elasticsearch_exporter --es.uri="https://用户名:密码@10.0.81.101:9200" --es.ssl-skip-verify 再修改prometheus.yml 增加如下配置: - job_name: 'es监控' static_configs: - targets: ['127.0.0.1:9114'] 重新执行: ./prometheus --config.file=prometheus.yml 在grafana中导入elasticsearch监控模板: https://github.com/justwatchcom/elasticsearch_exporter/blob/master/examples/grafana/dashboard.json 导入选择json格式即可 增加kafka监控 下载: [https://github.com/danielqsj/kafka_exporter/releases](https://github.com/danielqsj/kafka_exporter/releases) tar zxvf kafka_exporter-1.3.0.tar.gz cd kafka_exporter-1.3.0 #作者最新版忘了把编译后的文件放进去,所以需要先执行编译 go build # 生成一个kafka_exporter的可执行文件 ./kafka_exporter --tls.enabled --tls.ca-file="/etc/ca-cert" --tls.cert-file="/etc/kafka.client.pem" --tls.key-file="/etc/kafka.client.key" --tls.insecure-skip-tls-verify --kafka.server=10.0.81.22:9091 --log.level="debug" 修改 prometheus.yml 增加以下内容,还是一样 重新执行: ./prometheus --config.file=prometheus.yml - job_name: 'kafka监控' static_configs: - targets: ['127.0.0.1:9308'] grafana导入kafka模板: id为7589 监控flink 我这里用的是flink1.12.0 安装在/opt/目录下 flink在发布时自带了prometheus的jar包,先复制prometheus的jar包到flink的lib目录下 cp /opt/flink-1.12.0/plugins/metrics-prometheus/flink-metrics-prometheus-1.12.0.jar /opt/flink-1.12.0/lib/ 修改配置增加监控数据:/opt/flink-1.12.0/conf/flink-conf.yaml metrics.reporter.promgateway.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter metrics.reporter.promgateway.host: 127.0.0.1 metrics.reporter.promgateway.port: 9091 metrics.reporter.promgateway.jobName: myJob metrics.reporter.promgateway.randomJobNameSuffix: true metrics.reporter.promgateway.deleteOnShutdown: false 修改完成之后重启flink,确保任务都正常运行 修改 prometheus.yml 增加以下内容,还是一样 重新执行: ./prometheus --config.file=prometheus.yml - job_name: 'flink监控' static_configs: - targets: ['127.0.0.1:9091'] grafana导入模板: https://grafana.com/grafana/dashboards?search=flink 安装pushgateway: https://github.com/prometheus/pushgateway/releases/tag/v1.4.0 wget https://github.com/prometheus/pushgateway/releases/download/v1.4.0/pushgateway-1.4.0.linux-amd64.tar.gz tar zxvf pushgateway-1.4.0.linux-amd64.tar.gz cd pushgateway-1.4.0.linux-amd64 ./pushgateway

优秀的个人博客,低调大师

springcloud微服务全家桶实战

springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin 注意:这篇文章是基于springboot1.x老版本springcloud,springboot2.x的springcloud(Finchley之后)新版本文章,请移步升级版专贴 相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展。会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新建的项目都是用springboot,附源码下载,推荐使用coding地址下载,因为可以切换分支,后期可以及时更新。 coding仓库地址(推荐下载): coding地址 csdn下载地址: csdn下载地址 远程配置仓库地址 远程配置仓库地址 如果有问题请在下边评论,或者200909980加群交流。 Eureka/Consul:服务发现 (根据情况选择一个) Hystrix:断路器 Zuul:智能路由 Ribbon/Feign:客户端负载均衡 (Feign用的更多) Turbine:集群监控 Springcloud-config:远程获取配置文件 这里写图片描述 接下来,我们开始搭建项目,首先我们到spring为我们提供的一个网站快速搭建springboot项目,点击访问,我这里用的是gradle,如果各位客官喜欢用maven,好吧你可以到http://mvnrepository.com/查看对应的依赖,点我访问。 一、搭建eureka-server服务springcloud-eureka-server 使用 spring-cloud-consul 作为服务发现 请参考 点击查看使用springcloud consul 作为服务发现 eureka-server作为服务发现的核心,第一个搭建,后面的服务都要注册到eureka-server上,意思是告诉eureka-server自己的服务地址是啥。当然还可以用zookeeper或者springconsul。 这里写图片描述 1.修改build.gradle文件 如果是maven项目请对应的修改pom.xml //加入阿里的私服仓库地址 maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } //加入依赖 compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka-server', version: '1.3.4.RELEASE' //加入security,是因为访问eureka-server需要用户名和密码访问,为了安全 compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '1.5.6.RELEASE' 还有几点需要修改的,大家对应图片看看,就是springboot打包的时候会提示找不到主累。 这里写图片描述 2.修改 application.yml,建议用yml。 server: port: 8761 eureka: datacenter: trmap environment: product client: healthcheck: enabled: true service-url: defaultZone: http://root:booszy@localhost:8761/eureka register-with-eureka: false #关闭自己作为客户端注册 fetch-registry: false security: basic: enabled: true user: name: root #用户名和密码,等会访问的时候,会要求你登录,服务注册的时候也需要带着用户名和密码 password: booszy 3.修改程序的主类,建议修改类名,要加如eureka的 @EnableEurekaServer 注解,然后运行main方法。 @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } 这里写图片描述 http://localhost:8761/ 这个是eureka-server的页面地址,到这里,说明eureka-server搭建好了,简单吧,这一步一定要成功,否则后面的就不能继续进行下去了,后边基本类似。 二、搭建config-server服务springcloud-config-server springcloud-config-server是用来将远程git仓库的配置文件动态拉下来,这样配置文件就可以动态的维护了。当然也可以选择本地仓库。 新建一个springboot项目,修改maven私服地址,并加入一下依赖。 1.修改build.gradle文件 compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-config-server', version: '1.3.2.RELEASE' compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE' //连接config-server也需要用户名和密码 compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '1.5.6.RELEASE' 2.修改application.yml文件 server: port: 8500 eureka: client: service-url: #注册服务到eureka上,记住这里要加上eureka-server的用户名和密码 defaultZone: http://root:booszy@localhost:8761/eureka instance: prefer-ip-address: true #可能比较长,复制的时候请写在一行 instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} appname: springcloud-config-server spring: application: name: springcloud-config-server cloud: config: server: git: #这是其他项目配置文件的git仓库地址 uri: https://git.coding.net/yirenyishi/springcloud-config-profile searchPaths: '{application}' security: basic: enabled: true user: #这是config-server的用户名和密码 name: root password: booszy 3.修改启动类 修改启动类,要加入这三个注解,因为要注册到eureka-server上,所以需要@EnableEurekaClient这个注解 @SpringBootApplication @EnableConfigServer @EnableEurekaClient public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } } 然后运行启动springboot项目,等启动成功后访问eureka的页面,会发现springcloud-config-server已经注册到上面了,如果启动报错,请检查错误信息。 这里写图片描述 三、搭建服务提供者服务springcloud-provider-config 编写一个服务提供者,提供两个接口,即获取单个用户的信息和获取一个用户列表。用到了spring-data-jpa 和 spring-webmvc ,当然你们公司用什么你还是继续用什么。 注意 : 这里除了application.xml,还需要一个bootstrap.yml, 因为bootstrap.yml得加载顺序是在application.xml前边 修改build.gradle文件 compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-web') compile("com.alibaba:druid-spring-boot-starter:1.1.2") compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE' compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '1.3.2.RELEASE' compile group: 'org.springframework.session', name: 'spring-session-data-redis', version: '1.3.1.RELEASE' runtime('mysql:mysql-connector-java') 2.编写配置文件bootstrap.yml ** 注意 : 这里除了application.xml,还需要一个bootstrap.yml* application.xml我是放到远程仓库地址的,大家可以直接到我的远程仓库,根据项目名(springcloud-provider-config)查询。配置文件的仓库地址:点击访问。 spring: application: name: springcloud-provider-config cloud: config: #config-server的配置,不需要硬编码config-server的地址,使用service-id去eureka-server获取cong-server的地址 discovery: enabled: true service-id: springcloud-config-server fail-fast: true username: root password: booszy profile: dev eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} appname: springcloud-provider-config 3.编写代码 编写主类 @SpringBootApplication @EnableEurekaClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } } 新建UserController, 考虑篇幅 UserService 和 UserRepository就不贴代码了,想看的可以下载我的代码。 @RequestMapping("user") @RestController public class UserController { @Autowired private UserService userService; /** * @param id * @return */ @GetMapping("{id}") public User getuser(@PathVariable String id) { User user = null; try { System.out.println(id); user = userService.find(id); } catch (Exception e) { e.printStackTrace(); } return user; } /** * @return */ @GetMapping("list") public List<User> users() { try { List<User> user = userService.findAll(); if (user != null && user.size() != 0) { return user; } return null; } catch (Exception e) { e.printStackTrace(); } return null; } } 运行springboot项目,去eureka-server查看,有没有注册上。 这里写图片描述 我们的springcloud-provider-config已经注册到eureka上了,访问接口,成功。 这里写图片描述 四、搭建消费者服务springcloud-consumer-ribbon-config-swagger 消费者要访问服务提供者的服务,这里用的是通过RestTemplate请求resetful接口,使用ribbon做客户端负载均衡,hystrix做错误处理,swagger生成接口文档。文章结尾处会更新feign的案例,feign和ribbon二选一,也可以都用。 还是熟悉的配方,熟悉的味道,新建springboot项目,添加项目依赖。 1.修改build.gradle文件 compile('org.springframework.boot:spring-boot-starter-web') compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE' compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '1.3.2.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '1.3.4.RELEASE' compile( "io.springfox:springfox-swagger2:2.7.0", "io.springfox:springfox-swagger-ui:2.7.0" ) 2.修改bootstrap.yml文件 application.yml 在git仓库,请前往git仓库查看。 spring: application: name: springcloud-consumer-config cloud: config: discovery: enabled: true service-id: springcloud-config-server fail-fast: true username: root password: booszy profile: dev eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} appname: springcloud-consumer-config 3.编写代码 启动类代码 @RibbonClient 指定服务使用的负载均衡类型,name不指定服务则为所有的服务打开负载均衡,也可以在用yml中进行配置。 @EnableHystrix 是支持hystrix打开断路器,在规定时间内失败参数超过一定参数,就会打开断路器,不会发起请求,而是直接进入到错误处理方法。 @SpringBootApplication @EnableEurekaClient @RibbonClient(name = "springcloud-provider-config", configuration = RibbonConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExtendRibbon.class)}) @EnableHystrix public class ConsumerApplication { @Autowired private RestTemplateBuilder builder; @Bean @LoadBalanced public RestTemplate restTemplate() { return builder.build(); } public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } 新建UserController ribbon一个坑,不能接受List类型,要使用数组接收。 @Api xxx 是swagger的注解 @HystrixCommand(fallbackMethod="userFallbackMethod") 如果请求失败,会进入userFallbackMethod这个方法,userFallbackMethod这个方法要求参数和返回值与回调他的方法保持一致。 ribbon这个方法就是通过service-id获取获取服务实际的地址,这样服务的地址就不用硬编码了。 @Api("springcloud consumer user 控制器") @RequestMapping("user") @RestController public class UserController { @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancerClient loadBalancerClient; /** * @param id * @return */ @ApiOperation(value = "根据用户id查询用户信息", httpMethod = "GET", produces = "application/json") @ApiResponse(code = 200, message = "success", response = User.class) @GetMapping("{id}") @HystrixCommand(fallbackMethod="userFallbackMethod") public User getUser(@ApiParam(name = "id", required = true, value = "用户Id") @PathVariable String id) { return this.restTemplate.getForObject("http://springcloud-provider-config/user/" + id, User.class); } public User userFallbackMethod(String id){ return null; } /** * 这块ribbon不支持复杂数据类型list,所以要用数组接受,然后转list * @return */ @GetMapping("list") @HystrixCommand(fallbackMethod = "userList") public List<User> users(HttpServletRequest request) { try { User[] forObject = this.restTemplate.getForObject("http://springcloud-provider-config/user/list", User[].class); List<User> users = Arrays.asList(forObject); return users == null ? new ArrayList<User>() : users; } catch (Exception e) { e.printStackTrace(); } return null; } public List<User> userList(HttpServletRequest request) { return null; } /** * 通过服务id获取服务的地址 * @return */ @GetMapping("ribbon") public String ribbon(){ ServiceInstance serviceInstance = loadBalancerClient.choose("springcloud-provider-config"); return serviceInstance.getUri().toString(); } } 运行springboot项目,先看有没有注册到eureka-server上。 这里写图片描述 注册成功后,访问接口,测试是否正确。 这里写图片描述 测试swagger-ui,访问localhost:8200/swagger-ui.html 这里写图片描述 到这里消费者服务就算是完成了,后边大家自己进行扩展。 五、用zuul做路由转发和负载均衡 这些微服务都是隐藏在后端的,用户是看不到,或者不是直接接触,可以用nginx或者zuul进行路由转发和负载均衡,zuul负载均衡默认用的是ribbon。 1.修改build.gradle文件 compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-zuul', version: '1.3.4.RELEASE' compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '1.3.2.RELEASE' 2.修改bootstrap.yml 还是原来的配方,application.yml在git仓库 spring: application: name: springcloud-zuul cloud: config: discovery: enabled: true service-id: springcloud-config-server fail-fast: true username: root password: booszy profile: dev eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} appname: springcloud-zuul 3.启动类 @RefreshScope这个注解是当application.yml配置文件发生变化的时候,不需要手动的进行重启,调用localhost:8400/refresh,就会加载新的配置文件,当然正在访问的客户并不影响还是使用旧的配置文件,因为不是重启,后来的用户会使用新的配置文件。注意这块的刷新要用post请求。 @SpringBootApplication @EnableEurekaClient @EnableZuulProxy @RefreshScope public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } } 启动springboot项目,访问eureka-server 这里写图片描述 这时候,我们就要通过zuul访问微服务了,而不是直接去访问微服务。 应该访问地址http://192.168.89.89:8400/springcloud-consumer-config/user/list,这块你要换成你的zuul地址。 但是有些人就会说,这样以后用户请求会不会太长,比较反感,所以可以通过配置进行修改访问地址。 zuul: routes: springcloud-consumer-config: /consumer/** springcloud-provider-config: /provider/** 在application.yml中加入这样一段配置,其实就是nginx中的反向代理,使用一下简短的可以代理这个微服务。这个时候我们就可以这样去访问了http://192.168.89.89:8400/consumer/user/list,是不是简短了很多 这里写图片描述 六、用hystrix-turbine-dashboard 做集群监控 项目在生产环境中,每个服务的访问量都不通,有些服务的访问量比较大,有时候有些服务挂了,不能继续服务,需要重启的时候,我们并不知道,所以这时候就需要使用hystrix-turbine-dashboard做一个监控,监控所有的微服务,可以看到这个接口实时访问量,和健康状况。 新建一个springboot项目,老套路,加入如下依赖 1 添加依赖 compile('org.springframework.boot:spring-boot-starter-web') compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-netflix-turbine', version: '1.3.4.RELEASE' compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '1.3.4.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix-dashboard', version: '1.3.4.RELEASE' 2 修改application.yml配置文件 server: port: 8900 eureka: client: healthcheck: enabled: true service-url: defaultZone: http://root:booszy@localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} appname: springcloud-turbine-dashboard turbine: aggregator: clusterConfig: default appConfig: springcloud-consumer-config,springcloud-provider-config clusterNameExpression: "'default'" spring: application: name: springcloud-turbine-dashboard appConfig 后面是要检测的注册在eureka上的服务名,必须要有 3 修改主类 @EnableTurbine ,@EnableHystrixDashboard 一个都不能少 @SpringBootApplication @EnableTurbine @EnableEurekaClient @EnableHystrixDashboard public class TurbineDashboardApplication { public static void main(String[] args) { SpringApplication.run(TurbineDashboardApplication.class, args); } } 4 访问测试 这块的端口是8900,访问地址http://localhost:8900/hystrix.stream,看到的是下面的页面。 访问hystrix-dashboard页面 然后在那个网址的输入框里输网址http://localhost:8900/turbine.stream,点击monitor stream。刚打开的时候可能是空的,什么也没有,这并不表示你已经错了。这时候你访问消费者服务的接口,例如访问http://localhost:8200/user/list,多访问几次,然后看控制台有没有出现一个监控面板,没有就等会刷新一次,如果一直不出现,应该是配置有问题。 这里写图片描述 后边更新会追加到后边,后边随时更新 2018-01-24 更新:补充使用feign 七、使用feign 在实际开发中,feign使用的还是挺多的,feign底层还是使用了ribbon。废话不多说,直接上步骤,在服务消费者中使用feign访问服务提供者。新建一个springboot项目,或者复制一个。 1加入依赖 swagger不使用的话,可以删掉。 compile('org.springframework.boot:spring-boot-starter-web') compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE' compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '1.3.2.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-feign', version: '1.3.4.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '1.3.4.RELEASE' compile( "io.springfox:springfox-swagger2:2.7.0", "io.springfox:springfox-swagger-ui:2.7.0" ) 2修改配置文件 这里修改的是bootstrap.yml,这里吧application.yml的配置也贴出来,这个是放在远程仓库的,通过config动态拉取下来。 spring: application: name: springcloud-consumer-feign cloud: config: discovery: enabled: true service-id: springcloud-config-server fail-fast: true username: root password: booszy profile: csdn eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} appname: springcloud-consumer-feign application.yml server: port: 8201 logging: level: com.yasaka.stock.feign.MFeignClient: debug feign: hystrix: enabled: true ribbon: ReadTimeout: 30000 ConnectTimeout: 15000 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 10000 feign的默认请求超时时间是1s,所以经常会出现超时的问题,这里我设置的是10s,因为我的数据库服务器在美国,所以有时候请求会比较慢。ribbon的请求时间也要设置,因为feign用的是ribbon。 3 编码 1、主类注解 @EnableFeignClients @EnableCircuitBreaker @EnableHystrix 这三个都要,hystrix主要作用是断路器,会进如fein的fallback中。 @SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableCircuitBreaker @EnableHystrix public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } 2、编写feign接口,MFeignClient.class name是指要请求的服务名称。这里请求的是服务提供者 fallback 是指请求失败,进入断路器的类,和使用ribbon是一样的。 configuration 是feign的一些配置,例如编码器等。 @FeignClient(name = "springcloud-provider-config",fallback = HystrixFeignFallback.class, configuration = MFeignConfig.class) public interface MFeignClient { //这里是使用feign请求的地址 @RequestMapping(method = RequestMethod.GET, value = "/user/{id}") User getUser(@PathVariable("id") String id); //新版本支持使用GetMapping,之前的老版本可能不支持 @GetMapping(value = "/user/list") List<User> getUsers(); } 3 MFeignConfig.class feign的配置 这里配置了feign的打印日志等级 @Configuration public class MFeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } 4 HystrixFeignFallback.class ,断路器回调方法 断路器要实现上边定义的MFeignClient接口,请求失败,进入断路器时,会回调这里的方法。 @Component public class HystrixFeignFallback implements MFeignClient { @Override public User getUser(String id) { User user = new User(); user.setId("233"); return user; } @Override public List<User> getUsers() { return new ArrayList<User>(); } } 5 在controller中使用feign @Api("springcloud consumer user 控制器") @RequestMapping("user") @RestController public class UserController { @Autowired private MFeignClient feignClient; /** * @param id * @return */ @ApiOperation(value = "根据用户id查询用户信息", httpMethod = "GET", produces = "application/json") @ApiResponse(code = 200, message = "success", response = User.class) @GetMapping("{id}") public User getUser(@ApiParam(name = "id", required = true, value = "用户Id") @PathVariable String id) { User user = feignClient.getUser(id); return user; } @GetMapping("list") public List<User> users(HttpServletRequest request) { try { List<User> users = feignClient.getUsers(); return users == null ? new ArrayList<User>() : users; } catch (Exception e) { e.printStackTrace(); } return null; } } 20180125更新: 补充使用sleuth+zipkin 实现链路追踪服务 八、使用sleuth+zipkin 实现链路追踪服务 在使用微服务的时候,我们发现,有时候排错不好排查,所以就给大家整个这个链路追踪,很方便知道是哪一个服务调用哪一个服务出现了问题。因为有些项目可能服务比较多。 1 添加依赖 新建一个springboot项目 虽然其他服务调用zipkin不是从eureka上动态过去服务地址,而是硬编码,但是这块还是考虑吧zipkin注册到eureka上。 compile group: 'io.zipkin.java', name: 'zipkin-server', version: '2.4.4' compile group: 'io.zipkin.java', name: 'zipkin-autoconfigure-ui', version: '2.4.4' compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE' 2 修改application配置文件 server: port: 9411 eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} appname: springcloud-zipkin-server spring: application: name: springcloud-zipkin-server 3 主类注解添加 @EnableZipkinServer 主要是这个注解 启动服务后访问http://localhost:9411,就可以打开zipkin的控制台页面,这时候应该是什么都没有 @SpringBootApplication @EnableZipkinServer @EnableEurekaClient public class ZipkinServerApplication { public static void main(String[] args) { SpringApplication.run(ZipkinServerApplication.class, args); } } 4 其他服务中调用 这里我们在消费者服务和提供者服务里都加入如下依赖 .... compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-sleuth', version: '1.3.1.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-sleuth-zipkin', version: '1.3.1.RELEASE' ... 然后修改配置文件,bootstrap.yml、 这块zipkin的地址是硬编码的,目前还没发现怎么从服务注册中心eureka上动态获取,以后有解决方案,会更新帖子 sleuth这个是配置提取率,可以配置也可以不配置 spring: zipkin: base-url: http://localhost:9411 sleuth: sampler: percentage: 1.0 启动服务,然后访问消费者服务的接口,这时候访问zipkin的控制台http://localhost:9411 查看服务列表 点击依赖分析,可以看到调用服务链,因为这块只涉及到两个服务,所以只有两个,在实际生产环境中,这块可能有很多,到时候看起来就特别直观了。 这里写图片描述 关注 如果有问题,请在下方评论,或者加群讨论 200909980 关注下方微信公众号,可以及时获取到各种技术的干货哦,如果你有想推荐的帖子,也可以联系我们的。 码农笔录二维码

优秀的个人博客,低调大师

JetBrains 全家桶 2024 首个大版本更新 (2024.1)

JetBrains 为多款 IDE发布了 2024 年度首个大版本更新 (2024.1),包括IntelliJ IDEA 、WebStorm、PhpStorm 和 PyCharm 等。 下面主要介绍 IntelliJ IDEA 2024.1 变化。 官方公告写道: IntelliJ IDEA 2024.1 引入了一系列令人期待的升级,可以帮助您简化工作流。 IntelliJ IDEA Ultimate 现已搭载全行代码补全,为整行代码提供全面的代码感知建议。对 Java 22 的支持可以确保与最新语言功能的兼容。 重做的终端能够增强命令行操作,编辑器中的粘性行则有助于更流畅地浏览代码库。 关键亮点 对 Java 22 功能的支持 IntelliJ IDEA 2024.1 提供了对 2024 年 3 月发布的 JDK 22 中的功能集的支持, 支持覆盖未命名变量与模式的最终迭代、字符串模板与隐式声明的类的第二个预览版,以及实例 main 方法。 此外,此更新还引入了对 super(...)之前预览状态下的 new 语句的支持。 新终端 (Beta) IntelliJ IDEA 2024.1 推出了重做的终端,具有可视化和功能增强,有助于简化命令行任务。 此更新为既有工具带来了全新的外观,命令被分为不同的块,扩展的功能集包括块间丝滑导航、命令补全和命令历史记录的轻松访问等 编辑器中的粘性行 此版本在编辑器中引入了粘性行,旨在简化大文件的处理和新代码库的探索。滚动时,此功能会将类或方法的开头等关键结构元素固定到编辑器顶部。 这将使作用域始终保持在视野中,您可以点击固定的行快速浏览代码。 索引编制期间 IDE 功能对 Java 和 Kotlin 可用 现在,代码高亮显示和补全等基本 IDE 功能可在项目索引编制期间用于 Java 和 Kotlin,这应该会增强您的启动体验。 此外,您可以在项目仍在加载时使用 Go to class(转到类)和 Go to symbol(转到符号)浏览代码。 用于缩小整个 IDE 的选项 您现在可以将 IDE 缩小到 90%、80% 或 70%,从而可以灵活地调整 IDE 元素的大小。 Java 字符串模板中的语言注入 IntelliJ IDEA 2024.1 引入了将语言注入字符串模板的功能。您可以使用注解,注解会自动选择所需语言,也可以使用 Inject language or reference(注入语言或引用)意图操作 (⌥Enter) 从列表中手动选择语言。 如果您使用后一种方式,IDE 将建议您插入语言注解。执行注入后,您可以再次调用意图操作列表,并选择在独立编辑器窗格中打开和编辑注入的片段。 改进的日志工作流 由于日志记录是日常开发的重要环节,我们引入了一系列更新来增强 IntelliJ IDEA 在日志方面的用户体验。现在,您可以从控制台中的日志消息轻松导航到生成它们的代码。 此外,IDE 会在有需要的位置建议添加记录器,并简化插入记录器语句的操作,即使记录器实例不在作用域内。 重做的Conflicts Detected(检测到冲突)对话框 版本 2024.1 重做了 Conflicts Detected(检测到冲突)对话框以提高可读性。现在,对话框中的代码反映了编辑器中的内容,使您可以更清楚地了解冲突,并且 IDE 会自动保存窗口大小调整以供将来使用。 另外还更新了按钮及其行为以简化重构工作流,对话框现在可以完全通过键盘访问,您可以使用快捷键和箭头键进行无缝交互。 相关链接https://www.jetbrains.com/zh-cn/idea/whatsnew/https://www.jetbrains.com/idea/download/

优秀的个人博客,低调大师

Paozhu C++ Web 框架全家桶 1.4.3 发布

本次发布支持多页面前端 使用404重写 多个目录 提供一个前端演示 Paozhu C++ Web框架 原生解析HTTP/1、HTTP/2、JSON协议 集成C++ ORM 1.特性🔥🔥🔥🔥🔥 ✅ 1. 自带json编解码不用第三方库,标准json支持 ✅ 2. 支持多域名网站 ✅ 3. 支持多域名ssl 服务端 ✅ 4. 支持http/1.1、http/2协议 ✅ 5. 支持websocket服务端 ✅ 6. 框架自带websocket推送,支持定时推送到webscoket客户端 ✅ 7. 支持同步httpclient get post ✅ 8. 框架自带ORM,使用链接池方式,目前支持mysql ✅ 9. 框架自带线程池,和用户代码运行的线程池 ✅10. 框架使用asio自带的协程 ✅11. 框架特色是I/O 使用协程池 用户代码运行使用线程池,类似GO那种调度,只是针对http请求调度 ✅12. 框架支持普通文件gzip、br,并支持缓存到磁盘,下次不用cpu再压缩 ✅13. URL、POST和上传文件,解析结果client.get[] client.post[] client.files[]方式获取内容 ✅14. 自带sendmail类库 ✅15. 生成二维码(qrcode),需要gd、qrencode库 ✅16. 插件化编程,热动态更新,使用动态库方式 ✅17. 框架内置通用数据缓存模块,ORM结果缓存,提高并发能力 ✅18. 框架controller目录注解功能,方便添加URL路由映射,降低入门心智 ✅19. 结构和类注解JSON功能,使用json_encode json_decode操作复杂C++结构体和JSON互转,可以参考Wiki ✅20. 提供一个完整admin后台管理框架(见后面图片), 访问URL为 /admin/main https://github.com/hggq/paozhu/

优秀的个人博客,低调大师

IntelliJ IDEA 2023.3 & JetBrains 全家桶年度大版本更新

JetBrains 为多款 IDE 发布了 2023 年度第 3 个大版本更新。 包括: IntelliJ IDEA 2023.3 在 IntelliJ IDEA 2023.3 中,AI Assistant 持续演进,现已超越技术预览阶段,获得了大量令人期待的改进。 在其他方面,此版本包括对最新 Java 21 功能的全面支持,引入了带有编辑操作的直观浮动工具栏,并添加了 Run to Cursor(运行到光标)嵌入选项来增强调试工作流。 此外 IntelliJ IDEA Ultimate 现在提供无缝的开箱即用 Kubernetes 开发体验。 详情:https://www.jetbrains.com/zh-cn/idea/whatsnew/ WebStorm 2023.3 改进 Angular、Svelte 和 Vue 支持、AI Assistant、针对 TypeScript 的更新,以及对 Cypress、Playwright 和 Node.js 原生测试运行程序的支持。 详情:https://www.jetbrains.com/zh-cn/webstorm/whatsnew/ GoLand 2023.3 GoLand 2023.3 带来多项重要的新功能: JetBrains 的 AI Assistant 现已全面推出,搭载大量新功能和改进,助力提高您在 JetBrains IDE 中的工作效率。 Dev Container 现已得到正式支持。 我们正在开发功能集,并积极推进 Dev Container 支持,因此它们带有“Beta”标记。 错误处理、单行returns和panics以及其他代码的代码折叠样式的巨大更新。 提高工作效率的多项提示、重构和快速修复,例如slice表达式的提示、自定义printf式函数的代码洞察,以及调试器增强。 GoLand 2023.3 还提供了针对 Docker 与 Kubernetes 集成、VCS 的更新,以及针对 Web 开发的一些调整。 详情:https://www.jetbrains.com/zh-cn/go/whatsnew/ 其他 IDE: DataGrip 2023.3 RubyMine 2023.3 DataSpell 2023.3 ReSharper C++ 2023.3 CLion Classic 2023.3 PhpStorm 2023.3 ReSharper 2023.3 Rider 2023.3

优秀的个人博客,低调大师

springboot2新版springcloud微服务全家桶实战

sb2.0新版springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin springboot 版本是 2.0.3.RELEASE ,springcloud 版本是 Finchley.RELEASE 本篇文章是springboot2.x升级后的升级springcloud专贴,因为之前版本更新已经好久了,好多人评论可不可以出个新版本,大家一定要注意,这是springboot2.x版本的,springboot1.x的请参考 点击查看文章,基本组件都不变就是升级jar包版本,主要就是hystrix-dashboard使用有点变化。还有一点要注意的是sc默认使用的是eureka1.9.x版本,大家一定要主要,不要自己手动改为2.x版本,因为2.x版本还没有正式发布,而且停止开发了,官方还在积极的维护1.x版本(并不是网传的闭源)。 相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展。会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新建的项目都是用springboot,附源码下载,推荐使用coding地址下载,因为可以切换分支,后期可以及时更新。 coding仓库地址(推荐下载): coding地址 远程配置仓库地址 远程配置仓库地址 如果有问题请在下边评论,或者200909980加群交流。或者关注文章结尾微信公众号,私信后台 Eureka/Consul/Zookeeper:服务发现 (根据情况选择一个,eureka已经宣布闭源) Hystrix:断路器 Zuul:智能路由 Ribbon/Feign:客户端负载均衡 (Feign用的更多) Turbine&hystrix-dashboard:集群监控 Springcloud-config:远程获取配置文件 接下来,我们开始搭建项目,首先我们到spring为我们提供的一个网站快速搭建springboot项目,点击访问,我这里用的是gradle,如果各位客官喜欢用maven,好吧你可以到http://mvnrepository.com/查看对应的依赖,点我访问。 1.png 一、搭建eureka-server服务sc-eureka-server 使用 spring-cloud-consul 作为服务发现 请参考 点击查看使用springcloud consul 作为服务发现 eureka-server作为服务发现的核心,第一个搭建,后面的服务都要注册到eureka-server上,意思是告诉eureka-server自己的服务地址是啥。当然还可以用zookeeper或者springconsul。 1.修改build.gradle文件 如果是maven项目请对应的修改pom.xml //加入阿里的私服仓库地址 maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } //加入依赖 compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-server') //加入security,是因为访问eureka-server需要用户名和密码访问,为了安全 compile('org.springframework.boot:spring-boot-starter-security') 还有几点需要修改的,大家对应图片看看,就是springboot打包的时候会提示找不到主类。 2.png 2.修改 application.yml,建议用yml。 server: port: 8761 eureka: datacenter: trmap environment: product server: # 关闭自我保护 enable-self-preservation: false # 清理服务器 eviction-interval-timer-in-ms: 5000 client: healthcheck: enabled: true service-url: defaultZone: http://root:booszy@localhost:8761/eureka/ register-with-eureka: false fetch-registry: false spring: security: basic: enabled: true user: name: root password: booszy 3.修改程序的主类,建议修改类名,要加如eureka的 @EnableEurekaServer 注解,然后运行main方法。 @EnableEurekaServer @SpringBootApplication public class Sb2scEurekaApplication { public static void main(String[] args) { SpringApplication.run(Sb2scEurekaApplication.class, args); } } 4.png http://localhost:8761/ 这个是eureka-server的页面地址,密码在yml配置文件中,到这里,说明eureka-server搭建好了,简单吧,这一步一定要成功,否则后面的就不能继续进行下去了,后边基本类似。 二、搭建config-server服务sc-config-server springcloud-config-server是用来将远程git仓库的配置文件动态拉下来,这样配置文件就可以动态的维护了。当然也可以选择本地仓库。 新建一个springboot项目,修改maven私服地址,并加入一下依赖。 1.修改build.gradle文件 compile('org.springframework.cloud:spring-cloud-config-server') compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') //连接config-server也需要用户名和密码 compile('org.springframework.boot:spring-boot-starter-security') compile('org.springframework.boot:spring-boot-starter-actuator') 2.修改application.yml文件 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}' eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka/ instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} appname: sc-config-server 3.修改启动类 修改启动类,要加入这三个注解,因为要注册到eureka-server上,所以需要@EnableDiscoveryClient这个注解 @EnableConfigServer @EnableDiscoveryClient @SpringBootApplication public class Sb2scConfigApplication { public static void main(String[] args) { SpringApplication.run(Sb2scConfigApplication.class, args); } } 然后运行启动springboot项目,等启动成功后访问eureka的页面,会发现sc-config-server已经注册到上面了,如果启动报错,请检查错误信息。 3.png 三、搭建服务提供者服务sc-provider 编写一个服务提供者,为下边的消费者提供服务,用到了spring-webflux(spring新出的非阻塞式框架)不是springmvc,当然你们公司用什么你还是继续用什么。 注意 : 这里除了application.xml,还需要一个bootstrap.yml, 因为bootstrap.yml得加载顺序是在application.xml前边,服务注册和config配置必须放到bootstrap.yml。 修改build.gradle文件 compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') 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)查询。配置文件的仓库地址:点击访问。 eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka/ instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} appname: sc-provider spring: application: name: sc-provider cloud: config: discovery: enabled: true service-id: sc-config-server fail-fast: true username: root password: booszy profile: csdn 3.编写代码 编写主类 @EnableDiscoveryClient @SpringBootApplication public class Sb2scProviderApplication { public static void main(String[] args) { SpringApplication.run(Sb2scProviderApplication.class, args); } } 新建IndexController进行测试,这里只是为了测试,案例代码使用的是webflux,如果想使用springmvc,修改jar包依赖即可。 @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项目,去eureka-server查看,有没有注册上。 5.png 我们的sc-provider已经注册到eureka上了,访问接口,成功。 6.png 四、搭建消费者服务sc-consumer 消费者要访问服务提供者的服务,这里用的是通过RestTemplate/feign请求resetful接口,使用ribbon做客户端负载均衡,hystrix做错误处理,feign和ribbon二选一,案例中ribbon和feign都有,也可以都用。 还是熟悉的配方,熟悉的味道,新建springboot项目,添加项目依赖。 1.修改build.gradle文件 compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') 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仓库查看。 eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka/ instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} appname: sc-consumer spring: application: name: sc-consumer cloud: 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打开断路器,在规定时间内失败参数超过一定参数,就会打开断路器,不会发起请求,而是直接进入到错误处理方法。 @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这个方法要求参数和返回值与回调他的方法保持一致。 @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项目,先看有没有注册到eureka-server上。 7.png 注册成功后,访问接口,测试是否正确。 8.png ribbon使用就是这么简单,ribbon是springboot自带,所以不需要单独添加依赖。 2.feign案例 在实际开发中,feign使用的还是挺多的,feign底层还是使用了ribbon。废话不多说,直接上步骤,在服务消费者中使用feign访问服务提供者。 1配置文件 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的一些配置,例如编码器等。 @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的打印日志等级 @Configuration public class MFeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } 4 MFeignClientFallback.class ,断路器回调方法 断路器要实现上边定义的MFeignClient接口,请求失败,进入断路器时,会回调这里的方法。 @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 @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; } } 9.png 五、用zuul做路由转发和负载均衡 这些微服务都是隐藏在后端的,用户是看不到,或者不是直接接触,可以用nginx或者zuul进行路由转发和负载均衡,zuul负载均衡默认用的是ribbon。 1.修改build.gradle文件 compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') 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仓库 eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka/ instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} appname: sc-zuul spring: application: name: sc-zuul cloud: 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请求。 @EnableDiscoveryClient @SpringBootApplication @EnableZuulProxy @RefreshScope public class Sb2scZuulApplication { public static void main(String[] args) { SpringApplication.run(Sb2scZuulApplication.class, args); } } 启动springboot项目,访问eureka-server 10.png 这时候,我们就要通过zuul访问微服务了,而不是直接去访问微服务。 应该访问地址http://localhost:8400/sc-consumer/feign/list,这块你要换成你的zuul地址。 但是有些人就会说,这样以后用户请求会不会太长,比较反感,所以可以通过配置进行修改访问地址。 zuul: routes: springcloud-consumer-config: /consumer/** springcloud-provider-config: /provider/** 在application.yml中加入这样一段配置,其实就是nginx中的反向代理,使用一下简短的可以代理这个微服务。这个时候我们就可以这样去访问了http://localhost:8400/consumer/feign/list,是不是简短了很多 11.png 六、用hystrix-turbine-dashboard 做集群监控 项目在生产环境中,每个服务的访问量都不通,有些服务的访问量比较大,有时候有些服务挂了,不能继续服务,需要重启的时候,我们并不知道,所以这时候就需要使用hystrix-turbine-dashboard做一个监控,监控所有的微服务,可以看到这个接口实时访问量,和健康状况。 新建一个springboot项目,老套路,加入如下依赖 1 添加依赖 compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') 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') 2 修改application.yml配置文件 注意:是application.yml,这里不需要bootstrap.yml server: port: 8900 eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka/ instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} appname: sc-dashboard turbine: aggregator: clusterConfig: default appConfig: sc-consumer clusterNameExpression: "'default'" spring: application: name: sc-dashboard #management: # endpoints: # web: # exposure: # include: '*' appConfig 后面是要检测的注册在eureka上的服务名,必须要有 3 修改主类 @EnableTurbine ,@EnableHystrixDashboard 一个都不能少 @EnableDiscoveryClient @SpringBootApplication @EnableTurbine @EnableHystrixDashboard public class Sb2scDashboardApplication { public static void main(String[] args) { SpringApplication.run(Sb2scDashboardApplication.class, args); } } 4 访问测试 这块的端口是8900,访问地址http://localhost:8900/hystrix,看到的是下面的页面。 13.png 然后在那个网址的输入框里输网址http://localhost:8900/turbine.stream,点击monitor stream。刚打开的时候可能是空的,什么也没有,这并不表示你已经错了。这时候你访问消费者服务的接口,例如访问http://localhost:8400/consumer/feign/list,多访问几次,然后看控制台有没有出现一个监控面板,没有就等会刷新一次,如果一直不出现,应该是配置有问题。 12.png 七、使用sleuth+zipkin 实现链路追踪服务 在使用微服务的时候,我们发现,有时候排错不好排查,所以就给大家整个这个链路追踪,很方便知道是哪一个服务调用哪一个服务出现了问题。因为有些项目可能服务比较多。 1 添加依赖 新建一个springboot项目 虽然其他服务调用zipkin不是从eureka上动态过去服务地址,而是硬编码,但是这块还是考虑吧zipkin注册到eureka上。 compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') 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有冲突,要排除依赖 configurations { compile.exclude module: 'log4j' compile.exclude module: 'slf4j-log4j12' compile.exclude module: 'spring-boot-starter-logging' } 2 修改application配置文件 server: port: 9411 spring: application: name: sc-sc-zipkin profiles: active: csdn eureka: client: service-url: defaultZone: http://root:booszy@localhost:8761/eureka/ instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} appname: sc-zipkin management: metrics: web: server: auto-time-requests: false 3 主类注解添加 @EnableZipkinServer 主要是这个注解 启动服务后访问http://localhost:9411,就可以打开zipkin的控制台页面,这时候应该是什么都没有 @EnableDiscoveryClient @SpringBootApplication @EnableZipkinServer public class Sb2scZipkinApplication { public static void main(String[] args) { SpringApplication.run(Sb2scZipkinApplication.class, args); } } 4 其他服务中调用 这里我们在消费者服务和提供者服务里都加入如下依赖 .... compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-sleuth', version: '1.3.1.RELEASE' compile group: 'org.springframework.cloud', name: 'spring-cloud-sleuth-zipkin', version: '1.3.1.RELEASE' ... 然后修改配置文件,bootstrap.yml、 这块zipkin的地址是硬编码的,目前还没发现怎么从服务注册中心eureka上动态获取,以后有解决方案,会更新帖子 sleuth这个是配置提取率,可以配置也可以不配置 spring: zipkin: base-url: http://localhost:9411 sleuth: sampler: percentage: 1.0 启动服务,然后访问消费者服务的接口,这时候访问zipkin的控制台http://localhost:9411 14.png 点击依赖分析,可以看到调用服务链,因为这块只涉及到两个服务,所以只有两个,在实际生产环境中,这块可能有很多,到时候看起来就特别直观了。 15.png 16.png 关注 如果有问题,请在下方评论,或者加群讨论 200909980 关注下方微信公众号,可以及时获取到各种技术的干货哦,如果你有想推荐的帖子,也可以联系我们的。

优秀的个人博客,低调大师

Day10 鸿蒙,Ability全家桶(二)如何后台运行任务

今天我们来聊一下Service Ability,基于Service模板的Ability(以下简称“Service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。 这里就不得不提到另外一个知识点,线程。 其实目前我们前面提到的一些UI布局的绘制都是在主线程上进行的,又称UI线程,默认情况下,所有的操作都是在主线程上执行,这里如果我们系统通过ServiceAbility来完成后台运行任务,我们首先要初步了解一下asyncDispatch。 (1)初识TaskDispatcher的异步派发任务asyncDispatch; 那么TaskDispatcher又是什么呢?TaskDispatcher是一个任务分发器,它是Ability分发任务的基本接口,隐藏任务所在线程的实现细节。详细的介绍我们放到后面,先来了解异步派发任务asyncDispatch:派发任务,并立即返回,返回值是一个可用于取消任务的接口。 (2)创建Service Ability; 通过工具栏File->New->Ability->Empty Service Ability来创建Service Ability,这样创建的好处是可以在config.json中自动完成Service Ability的配置。 (3)启动Service Ability; 这里还可以通过Intent的构造元素Parameters来传递参数,进行简单的数据传递。 (4)连接ServiceAbility 如果Service需要与Page Ability或其他应用的Service Ability进行交互,则应创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行连接。在使用connectAbility()处理回调时,需要传入目标Service的Intent与IAbilityConnection的实例。IAbilityConnection提供了两个方法供开发者实现:onAbilityConnectDone()用来处理连接的回调,onAbilityDisconnectDone()用来处理断开连接的回调。 连接时步骤(1)(2)保持不变,connectAbility中传入intentService和connection。 这里详细的创建IDL文件过程可参考《IDL接口使用规范》和《定义HarmonyOS IDL接口》。这个在后续的文章中分析讨论,目前官方的接口还无法成功回调onAbilityConnectDone()。 (5)最后附上其生命周期的说明。 本文由GZH程序员小小叶发布!

优秀的个人博客,低调大师

App高危漏洞 Android用户记得更新百度全家桶

iOS 的 XcodeGhost 漏洞事件才结束不久,Android 紧接着就迎来了一次安全危机。 乌云平台发布报告称,已经有白帽子发现了多款 Android 应用存在 WormHole 漏洞,黑客可以利用这个漏洞攻击任何存在漏洞的联网手机,执行恶意代码就可以直接操控你手中的手机。 首先要提及的是,WormHole 漏洞是什么? 这个漏洞的发现者实际身份是阿里研究院的一名工程师,当然它的另一个身份就是这次事件中的白帽子,他先是发现了百度旗下多款应用存在 WormHole 漏洞。 不管你是 Android 的哪个系统平台(包括 Android M),他都可以直接通过这个漏洞攻击任何联网的 Android 手机,无论手机是否 root,它都可以让存在漏洞的手机弹出消息,弹出另一个应用,上传手机内数据,或者打开任意一个植入木马或者病毒的网页链接。 那么到底是哪些 app 中招了? 据不完全统计,目前网络上的信息都指向了百度的多款应用,这些应用是:百度地图、百度浏览器、百度贴吧、百度翻译、百度视频、百度手机助手、百度云、百度音乐、百度新闻、百度图片、百度输入法等,当然还有一些第三方的应用像口袋理财或者萌萌聊天等。 一些媒体咨询了相关的安全专家:“WormHole 漏洞”其实是基于百度的广告端口存在身份验证和权限控制缺陷而产生的。而此端口本来是用于广告网页、升级下载、推广 app 的用途。 所以我中招了,解救办法是什么? 目前乌云的这些漏洞已经得到了百度官方的确认,并已进行修复,百度方面表示目前升级到最新的软件即可解决这个问题。 相关的安全专家则建议,软件应该升级到官方的最新版本,如果这些软件还没有进行封堵漏洞的更新,用户应该卸载有漏洞的 app。 实际上,在最近的乌云漏洞平台报告中,乌云也指出了华为手机方面存在的 WormHole 漏洞,而且百度的相关漏洞也是在 10 月 20 号左右提交的,虽然被影响的 app 涉及用户数过亿,不过目前看来还没造成过大影响。 互联网时代,安全问题已经屡次被厂商提及,前段时间 163 网易邮箱的用户密码泄露事件,这个安全问题已因邮箱在互联生活中的特殊地位带来了极大的影响,黑客可以通过邮箱窃取绑定的其他平台账号,例如锁定你的手机,重置你其他平台的密码等。 我们所存在的互联空间中,终端与终端的互联也变的简单,这些连接也打破了传统安全基础设备那堵墙。360 总裁齐向东曾将移动互联网时代的安全问题比作矛与盾,即简单的攻防原理。 所以即使特别在意频发的漏洞问题,仍然还是会有攻破-解决-再攻破-再解决的过程,只是因为碎片化和开放性这些安全问题被放大的可能性增大了,但其 中攻防原理其实跟我们当年等待 iOS 破解是一样的道理,攻防本身与用户无关,这似乎就是一场黑白客之间的博弈,而作为用户还能做些什么呢? 原文发布时间为:2015-10-29 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

Bard 更新:迄今为止最强大的模型、集成谷歌全家桶

谷歌对话式 AI 产品 Bard 近日发布了更新。 从现在开始,Bard 开始提供插件生态。它可以调用丰富的谷歌应用 API,从而执行复杂的操作。你每天使用的谷歌工具,比如 Gmail、Docs、Drive、谷歌地图、Youtube、谷歌航班等应用,Bard 都能打开,然后从中为你找到需要的信息。 即使需要的信息分散在多个应用和服务中,有了 Bard 也能快速集成。 下文是更新说明。 全新推出:Bard 迄今为止最强大的模型 具体变化:得益于你的反馈,Bard 现在更直观明了、更富于想象力、响应速度更快。无论你是想要让 Bard 帮你撰写富有趣味和创意的内容,随心使用 40 多种语言中的任意一种与 Bard 对话,还是要寻求深度编程协助,或是从不同角度了解新主题,Bard 都能以更出色的质量和准确度帮助你探索各种可能性。 原因:我们秉承快速迭代原则,努力将 Bard 最先进的“黑科技”带给全世界。你的反馈帮助我们构建出了迄今为止最强大的 Bard 版本,让用户能够在世界各地使用多种语言与 Bard 协作。 借助改版后的“用 Google 搜索”功能核查 Bard 的回答 具体变化:利用 Google 搜索的强大功能,[G] 按钮可帮助你核查 Bard 使用 AI 生成的回答。此功能目前只支持英语。当我们能够评估某项陈述时,相应陈述会在 Bard 的回答中突出显示,点击一下即可了解详情。 注意:所提供的链接是 Google 搜索找到的内容,并不代表 Bard 原来给出的回答是根据这个来源生成的。 原因:如今,人们使用 AI 工具以新的方式更轻松地了解复杂的主题。随着你在 Bard 的帮助下学习新知,很重要的一点是让你对 AI 生成的信息更有信心。 接着与你分享的对话继续聊 具体变化:有人通过 Bard 的公共链接功能与你分享 Bard 对话时,你可以使用自己的账号接着这些对话继续聊。 原因:我们经常从其他人那里得到灵感启发,接触到的想法越多,就越有可能提出真正创新的想法。因此,我们希望你能够更轻松地将他人分享的对话作为切入点,展开自己的创意探索。 所有支持的语言都可使用更多功能 具体变化:在所有受支持的语言中,你现在可以使用 Google 智能镜头上传图片、在回答中看到来自 Google 搜索的图片,并让 Bard 将回答修改得更简单、更详尽、更简短、更专业或更随意一点。 原因:通过让 Bard 将回答修改得更符合你的需求,你将能够更好地控制自己的创意流程。在问题中加入图片可以激发新的创意,而回答中的图片将有助于你将创意变为现实。

优秀的个人博客,低调大师

手把手教你用 NebulaGraph AI 全家桶跑图算法

前段时间 NebulaGraph 3.5.0 发布,@**whitewum** 吴老师建议我把前段时间 NebulaGraph 社区里开启的新项目 ng_ai 公开给大家。 所以,就有了这个系列文章,本文是该系列的开篇之作。 ng_ai 是什么 ng_ai 的全名是:Nebulagraph AI Suite,顾名思义,它是在 NebulaGraph 之上跑算法的 Python 套件,希望能给 NebulaGraph 的用户一个自然、简洁的高级 API。简单来说,用很少的代码量就可以执行图上的算法相关的任务。 ng_ai 这个开源项目的目标是,快速迭代、公开讨论、持续演进,一句话概述便是: Simplifying things in surprising ways. 这个 ng_ai 的专属 url:https://github.com/wey-gu/nebulagraph-ai 可以帮你了解更全面的它。 ng_ai 的特点 为了让 NebulaGraph 社区的小伙伴拥有顺滑的算法体验,ng_ai 有以下特点: 与 NebulaGraph 紧密结合,方便从其中读、写图数据 支持多引擎、后端,目前支持 Spark(NebulaGraph Algorithm)、NetworkX,之后会支持 DGL、PyG 友好、符合直觉的 API 设计 与 NebulaGraph 的 UDF 无缝结合,支持从 Query 中调用 ng_ai 任务 友好的自定义算法接口,方便用户自己实现算法(尚未完成) 一键试玩环境(基于 Docker Extensions) 你可以这么用 ng_ai 跑分布式 PageRank 算法 可以在一个大图上,基于 nebula-algorithm 分布式地跑 PageRank 算法,像是这样: from ng_ai import NebulaReader # scan 模式,通过 Spark 引擎读取数据 reader = NebulaReader(engine="spark") reader.scan(edge="follow", props="degree") df = reader.read() # 运行 PageRank 算法 pr_result = df.algo.pagerank(reset_prob=0.15, max_iter=10) 写回算法结果到 NebulaGraph 假设我们要跑一个 Label Propagation 算法,然后把结果写回 NebulaGraph,我们可以这么做: 先确保结果中要写回图数据库的数据 Schema 已经创建好了,像是下面的示例,便是写到 label_propagation.cluster_id 字段里: CREATE TAG IF NOT EXISTS label_propagation ( cluster_id string NOT NULL ); 下面,我们来看下具体流程。执行算法: df_result = df.algo.label_propagation() 再看一下结果的 Schema: df_result.printSchema() root |-- _id: string (nullable = false) |-- lpa: string (nullable = false) 参考下面的代码,把 lpa 的结果写回 NebulaGraph 中的 cluster_id 字段里({"lpa": "cluster_id"}): from ng_ai import NebulaWriter from ng_ai.config import NebulaGraphConfig config = NebulaGraphConfig() writer = NebulaWriter( data=df_result, sink="nebulagraph_vertex", config=config, engine="spark" ) # 将 lpa 同 cluster_id 进行映射 properties = {"lpa": "cluster_id"} writer.set_options( tag="label_propagation", vid_field="_id", properties=properties, batch_size=256, write_mode="insert", ) # 将数据写回到 NebulaGraph writer.write() 最后,验证一下: USE basketballplayer; MATCH (v:label_propagation) RETURN id(v), v.label_propagation.cluster_id LIMIT 3; 结果: +-------------+--------------------------------+ | id(v) | v.label_propagation.cluster_id | +-------------+--------------------------------+ | "player103" | "player101" | | "player113" | "player129" | | "player121" | "player129" | +-------------+--------------------------------+ 更详细的例子参考:ng_ai/examples 通过 nGQL 调用算法 自 NebulaGraph v3.5.0 开始,用户可从 nGQL 中调用自己实现的函数。而 ng_ai 也用这个能力来实现了一个自己的 ng_ai 函数,让它从 nGQL 中调用 ng_ai 的算法,例如: -- 准备将要写入数据的 Schema USE basketballplayer; CREATE TAG IF NOT EXISTS pagerank(pagerank string); :sleep 20; -- 回调 ng_ai() RETURN ng_ai("pagerank", ["follow"], ["degree"], "spark", {space: "basketballplayer", max_iter: 10}, {write_mode: "insert"}) 更详细的例子参考:ng_ai/examples 单机运行算法 在单机、本地的环境,ng_ai 支持基于 NetworkX 运行算法。 举个例子,读取图为 ng_ai graph 对象: from ng_ai import NebulaReader from ng_ai.config import NebulaGraphConfig # query 模式,通过 NebulaGraph 或是 NetworkX 引擎读取数据 config_dict = { "graphd_hosts": "graphd:9669", "user": "root", "password": "nebula", "space": "basketballplayer", } config = NebulaGraphConfig(**config_dict) reader = NebulaReader(engine="nebula", config=config) reader.query(edges=["follow", "serve"], props=[["degree"], []]) g = reader.read() 查看、画图: g.show(10) g.draw() 运行算法: pr_result = g.algo.pagerank(reset_prob=0.15, max_iter=10) 写回 NebulaGraph: from ng_ai import NebulaWriter writer = NebulaWriter( data=pr_result, sink="nebulagraph_vertex", config=config, engine="nebula", ) # 待写入的属性 properties = ["pagerank"] writer.set_options( tag="pagerank", properties=properties, batch_size=256, write_mode="insert", ) # 将数据写回到 NebulaGraph writer.write() 其他算法: # 获取所有算法 g.algo.get_all_algo() # 获取相关算法的帮助信息 help(g.algo.node2vec) # 调用算法 g.algo.node2vec() 更详细的例子参考:ng_ai/examples 可视化图算法结果 这里演示一个 NetworkX 引擎情况下,计算 Louvain、PageRank 并可视化的例子: 先执行两个图算法: pr_result = g.algo.pagerank(reset_prob=0.15, max_iter=10) louvain_result = g.algo.louvain() 再手写一个画图好看的函数: from matplotlib.colors import ListedColormap def draw_graph_louvain_pr(G, pr_result, louvain_result, colors=["#1984c5", "#22a7f0", "#63bff0", "#a7d5ed", "#e2e2e2", "#e1a692", "#de6e56", "#e14b31", "#c23728"]): # 设定节点的位置 pos = nx.spring_layout(G) # 新建一个图形并设置坐标轴 fig, ax = plt.subplots(figsize=(35, 15)) ax.set_xlim(-1, 1) ax.set_ylim(-1, 1) # 从颜色列表中创建一个 colormap cmap = ListedColormap(colors) # 将图中的节点和边进行绘图 node_colors = [louvain_result[node] for node in G.nodes()] node_sizes = [70000 * pr_result[node] for node in G.nodes()] nx.draw_networkx_nodes(G, pos=pos, ax=ax, node_color=node_colors, node_size=node_sizes, cmap=cmap, vmin=0, vmax=max(louvain_result.values())) nx.draw_networkx_edges(G, pos=pos, ax=ax, edge_color='gray', width=1, connectionstyle='arc3, rad=0.2', arrowstyle='-|>', arrows=True) # 提取边数据中的 label 数据作为字典 edge_labels = nx.get_edge_attributes(G, 'label') # 在图中加入边的 label 数据 for edge, label in edge_labels.items(): ax.text((pos[edge[0]][0] + pos[edge[1]][0])/2, (pos[edge[0]][1] + pos[edge[1]][1])/2, label, fontsize=12, color='black', ha='center', va='center') # 在图中加入点的 label 数据 node_labels = {n: G.nodes[n]['label'] if 'label' in G.nodes[n] else n for n in G.nodes()} nx.draw_networkx_labels(G, pos=pos, ax=ax, labels=node_labels, font_size=12, font_color='black') # 为同社区数据添加相同颜色 sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=0, vmax=max(louvain_result.values()))) sm.set_array([]) cbar = plt.colorbar(sm, ax=ax, ticks=range(max(louvain_result.values()) + 1), shrink=0.5) cbar.ax.set_yticklabels([f'Community {i}' for i in range(max(louvain_result.values()) + 1)]) # 数据展示 plt.show() draw_graph_louvain_pr(G, pr_result=pr_result, louvain_result=louvain_result) 效果如下所示: 更详细的例子参考:ng_ai/examples 更方便的 Notebook 操作 NebulaGraph 结合 NebulaGraph 的 Jupyter Notebook 插件: https://github.com/wey-gu/ipython-ngql,我们还可以更便捷地操作 NebulaGraph: 可通过 ng_ai 的 extras 在 Jupyter Notbook 中安装插件: %pip install ng_ai[jupyter] %load_ext ngql 当然,也可以单独安装插件: %pip install ipython-ngql %load_ext ngql 安装完成后,就可以在 Notebook 里直接使用 %ngql 命令来执行 nGQL 语句: %ngql --address 127.0.0.1 --port 9669 --user root --password nebula %ngql USE basketballplayer; %ngql MATCH (v:player{name:"Tim Duncan"})-->(v2:player) RETURN v2.player.name AS Name; 注,多行的 Query 用两个百分号就好了 %%ngql 最后,我们还能在 Jupyter Notebook 里直接可视化渲染结果!只需要 %ng_draw 就可以啦! %ngql match p=(:player)-[]->() return p LIMIT 5 %ng_draw 效果如下: 未来工作 现在 ng_ai 还在开发中,我们还有很多工作要做: [ ] 完善 Reader 模式,现在 NebulaGraph / NetworkX 的读取数据只支持 Query-Mode,还需要支持 Scan-Mode [ ] 实现基于 dgl(GNN)的链路预测、节点分类等算法,例如: model = g.algo.gnn_link_prediction() result = model.train() # query src, dst to be predicted model.predict(src_vertex, dst_vertices) [ ] UDA,自定义算法 [ ] 快速部署工具 ng_ai 完全 build in public,欢迎社区的大家们来参与,一起来完善 ng_ai,让 NebulaGraph 上的 AI 算法更加简单、易用! 试玩 ng_ai 我们已经准备好了一键部署的 NebulaGraph + NebulaGraph Studio + ng_ai in Jupyter 的环境,只需要大家从 Docker Desktop 的 Extension(扩展)中搜索 NebulaGraph,就可以试玩了。 安装 NebulaGraph Docker 插件 在 Docker Desktop 的插件市场搜索 NebulaGraph,点击安装: 安装 ng_ai Playground 进入 NebulaGraph 插件,点击 Install NX Mode,安装 ng_ai 的 NetworkX Playground,通常要等几分钟等待安装完成。 进入 NetworkX Playground 点击 Jupyter NB NetworkX,进入 NetworkX Playground。 ng_ai 的架构 ng_ai 的架构如下,它的核心模块有: Reader:负责从 NebulaGraph 读取数据 Writer:负责将数据写入 NebulaGraph Engine:负责适配不同运行时,例如 Spark、DGL、NetowrkX 等 Algo:算法模块,例如 PageRank、Louvain、GNN_Link_Predict 等 此外,为了支持 nGQL 中的调用,还有两个模块: ng_ai-udf:负责将 UDF 注册到 NebulaGraph,接受 ng_ai 的 Query 调用,访问 ng_ai API ng_ai-api:ng_ai 的 API 服务,接受 UDF 的调用,访问 ng_ai 核心模块 ┌───────────────────────────────────────────────────┐ │ Spark Cluster │ │ .─────. .─────. .─────. .─────. │ │ ; : ; : ; : ; : │ ┌─▶│ : ; : ; : ; : ; │ │ │ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ │ │ │ `───' `───' `───' `───' │ Algo Spark │ Engine└───────────────────────────────────────────────────┘ │ ┌────────────────────────────────────────────────────┬──────────┐ └──┤ │ │ │ NebulaGraph AI Suite(ngai) │ ngai-api │◀─┐ │ │ │ │ │ └──────────┤ │ │ ┌────────┐ ┌──────┐ ┌────────┐ ┌─────┐ │ │ │ │ Reader │ │ Algo │ │ Writer │ │ GNN │ │ │ ┌───────▶│ └────────┘ └──────┘ └────────┘ └─────┘ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────┴───┬────────┴─────┐ └──────┐ │ │ │ │ ▼ ▼ ▼ ▼ │ │ │ │ ┌─────────────┐ ┌──────────────┐ ┌──────────┐ ┌──────────┐ │ │ │ ┌──┤ │ SparkEngine │ │ NebulaEngine │ │ NetworkX │ │ DGLEngine│ │ │ │ │ │ └─────────────┘ └──────────────┘ └──────────┘ └──────────┘ │ │ │ │ └──────────┬────────────────────────────────────────────────────┘ │ │ │ │ Spark │ │ │ └────────Reader ────────────┐ │ │ Spark Query Mode │ │ │ Reader │ │ │Scan Mode ▼ ┌─────────┐ │ │ ┌───────────────────────────────────────────────────┬─────────┤ ngai-udf│◀─────────────┐ │ │ │ │ └─────────┤ │ │ │ │ NebulaGraph Graph Engine Nebula-GraphD │ ngai-GraphD │ │ │ │ ├──────────────────────────────┬────────────────────┼───────────────────┘ │ │ │ │ │ │ │ │ │ │ NebulaGraph Storage Engine │ │ │ │ │ │ │ │ │ │ └─▶│ Nebula-StorageD │ Nebula-Metad │ │ │ │ │ │ │ │ └──────────────────────────────┴────────────────────┘ │ │ │ │ ┌───────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ RETURN ng_ai("pagerank", ["follow"], ["degree"], "spark", {space:"basketballplayer"}) │──┘ │ └───────────────────────────────────────────────────────────────────────────────────────┘ │ ┌─────────────────────────────────────────────────────────────┐ │ │ from ng_ai import NebulaReader │ │ │ │ │ │ # read data with spark engine, scan mode │ │ │ reader = NebulaReader(engine="spark") │ │ │ reader.scan(edge="follow", props="degree") │ └──│ df = reader.read() │ │ │ │ # run pagerank algorithm │ │ pr_result = df.algo.pagerank(reset_prob=0.15, max_iter=10) │ │ │ └─────────────────────────────────────────────────────────────┘ 谢谢你读完本文 (///▽///) 欢迎前往 GitHub 来阅读 NebulaGraph 源码,或是尝试用它解决你的业务问题 yo~ GitHub 地址:https://github.com/vesoft-inc/nebula

优秀的个人博客,低调大师

阿里发布 Qwen2.5 “全家桶” —— 历史上最大的开源发布

阿里今天发布了 Qwen 家族的最新成员:Qwen2.5,包括语言模型Qwen2.5,以及专门针对编程的Qwen2.5-Coder和数学的Qwen2.5-Math模型。 所有开放权重的模型都是稠密的、decoder-only 的语言模型,提供多种不同规模的版本,包括: Qwen2.5: 0.5B, 1.5B, 3B, 7B, 14B, 32B, 以及72B; Qwen2.5-Coder: 1.5B, 7B, 以及即将推出的32B; Qwen2.5-Math: 1.5B, 7B, 以及72B。 除了 3B 和 72B 的版本外,所有的开源模型都采用了 Apache 2.0 License。 Qwen2.5 主要升级内容 Qwen2.5 获得了显著更多的知识,在编程能力和数学能力有大幅提升。 在指令执行、生成长文本、理解结构化数据以及生成结构化输出方面有显著改进。 对各种 system prompt 更具适应性,增强了角色扮演实现和聊天机器人的条件设置功能。 Qwen2.5-Coder 使即使较小的编程专用模型也能在编程评估基准测试中表现出媲美大型语言模型的竞争力。 Qwen2.5-Math 支持 中文 和 英文,并整合了多种推理方法,包括 CoT、PoT 和 TIR。 Qwen2.5-Coder &Qwen2.5-Math 性能表现 据介绍,Qwen2.5语言模型在阿里最新的大规模数据集上进行了预训练,该数据集包含多达18Ttokens。 相较于 Qwen2,Qwen2.5 获得了显著更多的知识(MMLU:85+),并在编程能力(HumanEval 85+)和数学能力(MATH 80+)方面有了大幅提升。 此外,新模型在指令执行、生成长文本(超过 8K 标记)、理解结构化数据(例如表格)以及生成结构化输出特别是 JSON 方面取得了显著改进。 Qwen2.5 模型总体上对各种 system prompt 更具适应性,增强了角色扮演实现和聊天机器人的条件设置功能。 与 Qwen2 类似,Qwen2.5 语言模型支持高达128Ktokens,并能生成最多8Ktokens的内容。它们同样保持了对包括中文、英文、法文、西班牙文、葡萄牙文、德文、意大利文、俄文、日文、韩文、越南文、泰文、阿拉伯文等 29 种以上语言的支持。 专业领域的专家语言模型,即用于编程的Qwen2.5-Coder和用于数学的Qwen2.5-Math,相比其前身 CodeQwen1.5 和 Qwen2-Math 有了实质性的改进。 具体来说,Qwen2.5-Coder 在包含5.5Ttokens 编程相关数据上进行了训练,使即使较小的编程专用模型也能在编程评估基准测试中表现出媲美大型语言模型的竞争力。 同时,Qwen2.5-Math 支持中文和英文,并整合了多种推理方法,包括 CoT(Chain of Thought)、PoT(Program of Thought)和 TIR(Tool-Integrated Reasoning)。 详情查看发布公告。

优秀的个人博客,低调大师

开发者实战丨如何利用 OpenVINO™ 部署 Phi-3.5 全家桶

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 英特尔 AI 软件工程师 卢建晖 微软高级云技术布道师 排版| 吴紫琴 OpenVINO™ 近期微软发布其最新的 Phi-3.5 系列 SLM 模型, Phi-3.5-mini, Phi-3.5-vision, 以及 Phi-3.5-MoE,其中 Phi-3.5-mini 增加了多语种以及128k上下文长度的支持,提升中文输入的使用体验;Phi-3.5-vision 全面支持多图片理解任务,拓宽了其在视频理解任务类中的应用场景。 英特尔 AI PC 可以帮助用户利用人工智能技术提高工作效率、创意、游戏、娱乐和安全等性能。它搭载 CPU、GPU 和 NPU,可在本地更高效地处理 AI 任务。其中我们可以依靠 CPU 来运行较小的工作负载并实现低延迟,而 GPU 则非常适合需要并行吞吐量的大型工作负载,例如大语言模型推理任务,NPU 能够以低功耗处理持续运行 AI 工作负载,提高效率。开发者可以利用英特尔 OpenVINO™ 工具套件充分激活这些AI处理单元,更高效地部署深度学习模型,其中 Phi-3. 5 就是一个非常适合运行在 AI PC 上的模型任务。本文将分享如何利用 OpenVINO™ 在你的 AI PC 上部署最新 Phi-3.5-mini 及 Phi-3.5-vision 模型。 项目示例地址: https://github.com/openvino-dev-samples/Phi-3-workshop phi-3cookbook : https://aka.ms/phi-3cookbook OpenVINO™ Phi-3.5-mini 1. 模型转换与量化 由于 Phi-3.5 的预训练模型是基于 PyTorch 框架的,因此我们可以利用 Optimum-intel 的命令型工具快速从 Hugging Face 上导出 Phi-3.5-mini 的预训练模型,并通过内置的 NNCF 工具对模型进行权重量化压缩,以此提升推理性能,降低资源占用。 optimum-cliexport openvino--model microsoft/Phi-3.5-mini-instruct --task text-generation-with-past--weight-format int4--group-size 128--ratio 0.6--sym--trust-remote-code phi-3.5-mini-instruct-ov 开发者可以根据模型的输出结果,调整其中的量化参数,包括: weight-format:量化精度,可以选择 fp32,fp16,int8,int4,int4_sym_g128,int4_asym_g128,int4_sym_g64,int4_asym_g64。 group-size:权重里共享量化参数的通道数量。 ratio:int4/int8 权重比例,默认为1.0,0.6表示60%的权重以 int4 表,40%以 int8 表示。 sym:是否开启对称量化。 更多参数选项可以通过:optimum-cli export openvino -h 命令查询。 2.Optimum-intel部署 为了方便 Transformers 库用户体验 OpenVINO™,开发者可以利用 Optimum-intel 所提供的类 Transformers API 进行模型任务的部署。在不改变原本代码逻辑的前提下,只需要将 AutoModelForCausalLM 对象切换为 OVModelForCausalLM,便可以轻松实现对于推理后端的迁移,利用 OpenVINO™ 来加速 Phi-3.5-mini 原有的 Pipeline。 from optimum.intel.openvino import OVModelForCausalLMfrom transformers import AutoConfig, AutoTokenizerov_model = OVModelForCausalLM.from_pretrained( llm_model_path, device='GPU', config=AutoConfig.from_pretrained(llm_model_path, trust_remote_code=True), trust_remote_code=True,)tok = AutoTokenizer.from_pretrained(llm_model_path, trust_remote_code=True)prompt = "<|user|>\n你了解 .NET 吗?\n<|end|><|assistant|>\n"input_tokens = tok(prompt, return_tensors="pt", **tokenizer_kwargs)answer = ov_model.generate(**input_tokens, max_new_tokens=1024)tok.batch_decode(answer, skip_special_tokens=True)[0] 除此以外,你也可以通过 device 来指定模型部署的硬件平台为英特尔 CPU 或是 GPU。 3.GenAI API部署 当然考虑到 Transformers 中大量的第三方依赖,如果开发者想实现轻量化部署的目的,也可以利用 OpenVINO™ 原生的 GenAI API 来构建推理任务,由于 GenAI API 底层的 pipeline 是基于 C++ 构建,同时优化了 chat 模式下 kvcache 的缓存逻辑,因此相较 Optimum-intel,GenAI API 的资源占用和性能都是更优的。 import openvino_genai as ov_genaipipe=ov_genai.LLMPipeline(llm_model_path,"GPU") 可以看到在使用 GenAI API 的情况下,我们仅用3行代码就构建起了一个完整的文本生成任务 Pipeline。 OpenVINO™ Phi-3.5-vision 1. 模型转换与量化 目前 Phi-3.5-vision 的推理任务还没有被完全集成进 Optimum 工具中,因此我们需要手动完成模型的转换和量化,其中包含语言模型 lang_model,图像编码模型 image_embed,token 编码模型 embed_token 模型以及图像特征映射模型 img_projection。 为了简化转化步骤,我们提前对这些转化任务行进行了封装,开发者只需要调用示例中提供的函数便可完成这些模型的转换,并对其中负载最大的语言模型进行量化。 from ov_phi3_vision import convert_phi3_modelmodel_id = "microsoft/Phi-3.5-vision-instruct"out_dir = Path("../model/phi-3.5-vision-instruct-ov")compression_configuration = { "mode": nncf.CompressWeightsMode.INT4_SYM, "group_size": 64, "ratio": 0.6,}if not out_dir.exists():convert_phi3_model(model_id,out_dir,compression_configuration) 2. 图片内容理解 此外在该示例中,我们也对模型的推理任务进行封装,通过以下代码便可快速部署图像理解任务。 from transformers import AutoProcessor, TextStreamermessages = [ {"role": "user", "content": "<|image_1|>\nPlease create Python code for image, and use plt to save the new picture under imgs/ and name it phi-3-vision.jpg."},]processor = AutoProcessor.from_pretrained(out_dir, trust_remote_code=True)prompt = processor.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)inputs = processor(prompt, [image], return_tensors="pt")generation_args = {"max_new_tokens": 3072, "do_sample": False, "streamer": TextStreamer(processor.tokenizer, skip_prompt=True, skip_special_tokens=True)}print("Coding:")generate_ids=model.generate(**inputs,eos_token_id=processor.tokenizer.eos_token_id,**generation_args) 图:Phi-3.5-vision输出示例 可以看到在理解拼图内容后,Phi-3-vision 为我们生成了一段 Python 脚本来复现拼图数据。 3. 视频内容理解 由于 Phi-3.5-vision 可以同时支持对多个图像输入,因此可以基于这一特性实现视频内容理解,实现方法也特别简单,仅需对视频文件抽帧后保存为图片,并将这些图片基于 Phi-3.5-vision 提供的预处理脚本合并后,转化为 Prompt 模板,送入模型流水线进行推理。 images = [] placeholder = "" for i in range(1,4): with open("../examples/output/keyframe_"+str(i)+".jpg", "rb") as f: images.append(Image.open("../examples/output/keyframe_"+str(i)+".jpg")) placeholder += f"<|image_{i}|>\n"from transformers import AutoProcessor, TextStreamermessages = [ {"role": "user", "content": placeholder+"Summarize the video."},]processor = AutoProcessor.from_pretrained(out_dir, trust_remote_code=True)prompt = processor.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)inputs = processor(prompt, images, return_tensors="pt")generation_args = {"max_new_tokens": 500, "do_sample": False, "streamer": TextStreamer(processor.tokenizer, skip_prompt=True, skip_special_tokens=True)}print("Summary:")generate_ids = model.generate(**inputs, eos_token_id=processor.tokenizer.eos_token_id, **generation_args) OpenVINO™ 总结 通过 OpenVINO™ 封装后的 API 函数,开发者可以非常便捷地对预训练模型进行转化压缩,并实现本地化的推理任务部署。同时基于 Phi-3.5 在小语言模型场景下强大的文本与图像理解能力,我们仅在轻薄本上便可以构建起一个完整的语言模型应用,在保护用户数据隐私的同时,降低硬件门槛。 参考资料 Optimum-intel: https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide/llm-inference-hf.html OpenVINO Gen API: https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide/genai-guide.html OpenVINO™ --------------------------------------- *OpenVINO and the OpenVINO logo are trademarks of Intel Corporation or its subsidiaries. ----------------------------- OpenVINO 中文社区 微信号 : openvinodev B站:OpenVINO中文社区 “开放、开源、共创” 致力于通过定期举办线上与线下的沙龙、动手实践及开发者交流大会等活动,促进人工智能开发者之间的交流学习。 ○点击“在看”,让更多人看见 本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

JDK

JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。