当前位置: 首页 > 编程日记 > 正文

微服务实战之春云与刀客(三)—— 面向接口调用代码结构实例

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

概述

在上一篇中提到了spring cloud 面向接口调用的开发风格,这一篇会举一个简单的但完整的例子来说明整个代码结构。
代码已上传到 https://github.com/maruixiang/spring-cloud-demo/tree/master/demo1

代码结构

image

整个代码在demo1目录下面,包含了一个根级的parent pom文件和三个maven应用。

  • 根pom文件:所有应用的parent pom文件。
  • eureka :注册中心,用于服务注册和发现。
  • demo :demo微服务,它本身包含了两个模块,demo-api提供给第三方使用的接口;demo-service是服务的具体实现。
    为什么每个微服务多加了一层目录结构呢?因为从微服务职责划分来说,不同团队负责不同的微服务开发,每个微服务独立成项目,代码可以随时分离,不混合在一起。
  • client : 客户端调用服务。
    每个应用maven代码结构可以通过http://start.spring.io/ 、IDE工具或手动生成,这里不多述。

统一的根级的pom.xml

  • 这个文件是手工创建的,把spring boot基本信息都统一移到这里面来定义。
    spring-boot 1.5.7.RELEASE
    spring-cloud Dalston.SR3 。
  • 为了方便测试,我把三个应用的modules定义也放入了这里。而实际项目开发中,这个文件是不应该包含modules(实际开发中,这是一个基本不会修改的公共pom文件,不可能新加的微服务都放来来。正确做法是去掉modules,加入发布节点distributionManagement信息,把这个pom 通过mvn deploy 到maven 服务器上供所有的微服务使用即可)。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cehome.cloud</groupId><artifactId>cehome-cloud-parent</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.7.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.5.7.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><modules><module>eureka</module><module>demo</module><module>client</module></modules>
</project>

eureka注册中心

读音[ ju:`rika:]

定义pom

继承spring-cloud-parent ,引入依赖 spring-cloud-starter-eureka-server即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.cehome.cloud</groupId><artifactId>spring-cloud-parent</artifactId><version>1.0.0-SNAPSHOT</version><relativePath>../pom.xml</relativePath></parent><groupId>com.cehome.cloud</groupId><artifactId>eureka</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>eureka</name><description>Demo project for Spring Boot</description><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency></dependencies></project>

添加spring配置

tomcat端口使用eureka约定的8761

server.port=8761
spring.application.name=eureka
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
#是不是client?肯定不是啦。为true时,可以启动,但报异常:Cannot execute request on any known server
eureka.client.fetch-registry=false
#单注册中心设为false,集群是需要设为true以便多eureka互相同步
eureka.client.eureka-with-eureka=false

启动类

package com.cehome.cloud.eureka;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}

启动

运行main 方法,然后访问 http://localhost:8761/

开发demo微服务

demo 本身是包含两个模块的maven应用,一个是api供第三方调用,一个是具体逻辑。

接口模块 demo-api

  • 因为需要用到Feign,所以引入Feign依赖即可。
    在pom文件中,还要引入spring-boot-thin-layout 一个很重要的maven插件。因为spring boot 缺省是编译成fat jar(60m左右),而api是要打成jar包给第三方使用的,如果打成一个spring boot结构的fat jar,第三方肯定无法使用了,所以引入了这个maven插件,会把api打成一个我们普通使用的jar包(可能就10多K),这样才能真正实现接口跟逻辑分离的效果。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cehome.cloud</groupId><artifactId>demo-api</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>com.cehome.cloud</groupId><artifactId>demo-parent</artifactId><version>1.0.0-SNAPSHOT</version><relativePath>../pom.xml</relativePath></parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies><dependency><groupId>org.springframework.boot.experimental</groupId><artifactId>spring-boot-thin-layout</artifactId><version>1.0.5.RELEASE</version></dependency></dependencies></plugin></plugins></build></project>
  • 定义接口类。接口就只有一个get()方法,访问后返回一个固定字符串。
package com.cehome.cloud.demo.api;import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(name= "demo-service" )
public interface Demo1Service {@RequestMapping("/demo1/get")String get();}
  • 需要继续添加一个包含main()方法的类,这个可以随意定义。编译时spring boot 会取找一个main()方法,没有的话编译会报错。
package com.cehome.cloud.demo.api;public class DemoAPI {public static void main(String[] args) {}
}

服务模块demo-service

  • 定义pom.xml。除了spring-cloud-starter-eureka、spring-boot-starter-web、spring-cloud-starter-feign 这几个基本的微服务依赖,还要依赖上面定义的接口demo-api。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cehome.cloud</groupId><artifactId>demo-service</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>demo-service</name><description>Demo project for Spring Boot</description><parent><groupId>com.cehome.cloud</groupId><artifactId>demo-parent</artifactId><version>1.0.0-SNAPSHOT</version><relativePath>../pom.xml</relativePath></parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</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-feign</artifactId></dependency><dependency><groupId>com.cehome.cloud</groupId><artifactId>demo-api</artifactId><version>1.0.0-SNAPSHOT</version></dependency></dependencies></project>
  • 定义配置文件application.properties。 spring.application.name就是service Id,跟上面@Feign注解中的名字一样。
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
server.port = 8762
spring.application.name = demo-service
  • 实现main方法。
    @EnableEurekaClient 让服务跟eureka注册中心关联,可以作为服务提供者也可以作为消费者。
package com.cehome.cloud.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
//-- provider and consumer  service
@EnableEurekaClient
@ComponentScan("com.cehome.cloud.demo")
public class DemoServiceApplication {public static void main(String[] args) {SpringApplication.run(DemoServiceApplication.class);}
}
  • 继承Demo1Service 接口,实现服务Demo1ServiceImpl。注意这里的服务实际上是一个Controller,我们为了规范和便于管理,让其继承api中定义的接口Demo1Service ;且Demo1ServiceImpl的包名也是用service,不用controller,这就是一种约定,强调这是一个服务。
package com.cehome.cloud.demo.service;import com.cehome.cloud.demo.api.Demo1Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;@RestController
public class Demo1ServiceImpl implements Demo1Service {@Overridepublic String get() {return "This is Demo1 Service";}
}
  • 验证。访问 http://localhost:8762/demo1/get

客户端调用

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>com.cehome.cloud</groupId><artifactId>spring-cloud-parent</artifactId><version>1.0.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.cehome.cloud</groupId><artifactId>client</artifactId><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</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-feign</artifactId></dependency><dependency><groupId>com.cehome.cloud</groupId><artifactId>demo-api</artifactId><version>1.0.0-SNAPSHOT</version></dependency></dependencies>
</project>
  • application.properties
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
server.port = 8763
spring.application.name = client-demo
  • spring boot主程序。
    @EnableDiscoveryClient - 仅作为消费者(客户端),如果既作为消费端又同时作为服务提供者,则用@EnableEurekaClient。

@EnableFeignClients - 指定了Feign扫描api接口的范围。Feign扫描到包含@Feign注解的interface,然后会实例化一个spring代理bean,代理各种方法调用并转成URL发送请求。

package com.cehome.cloud.client;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
//-- consumer  http://blog.didispace.com/spring-cloud-tips-feign-rpc/
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.cehome.cloud"})
@RestController
@ComponentScan("com.cehome.cloud.client")
public class ClientApplication {public static void main(String[] args) {SpringApplication springApplication=new SpringApplication(ClientApplication.class);ConfigurableApplicationContext applicationContext=springApplication.run(args);}
}
  • 调用服务。可以看到,在pom.xml 引入demo-api后,通过

  • “@Autowired private Demo1Service demo1Service;” 方式,就像调用本地bean一样调用微服务。用户只要引入api jar包就行,不用关心服务部署在哪台机器,也不用care怎样拼接URL去调用服务,这是不是很符合java面向对象开发的要求?
  • 阅读原文

    http://click.aliyun.com/m/38898/

转载于:https://my.oschina.net/u/3637633/blog/1602982

相关文章:

如何创建复杂的机器学习项目?

翻译 | 光城责编 | 郭芮转载自CSDN&#xff08;CSDNnews&#xff09;scikit-learn提供最先进的机器学习算法。但是&#xff0c;这些算法不能直接用于原始数据。原始数据需要事先进行预处理。因此&#xff0c;除了机器学习算法之外&#xff0c;scikit-learn还提供了一套预处理方…

关闭vmware喇叭报警声

关闭vmware喇叭报警声 在vmware里面安装linux系统后&#xff0c;操作时经常使用tab键或使用VI时经常听到pc speaker突然叫一声&#xff0c;如果正当戴着耳机欣赏音乐&#xff0c;被这么一叫还要吓一跳。下面是解决办法&#xff1a;C:\Documents and Settings\All Users\Applica…

【ubuntu工具】Atom的简介及安装

Atom中文社区&#xff1a;https://atom-china.org/ 知乎atom&#xff1a;https://www.zhihu.com/question/22867204 Atom&#xff0c;是github用nodejs编写的一个编辑器 Atom安装步骤&#xff1a; sudo add-apt-repository ppa:webupd8team/atomsudo aptitude updatesudo a…

破解Win2008口令-ERD6.0

我们在日常使用计算机的过程中&#xff0c;大多都经历过由于忘记口令从而无法进入系统的遭遇。遇到这种问题该如何处理呢&#xff1f;很多朋友一定想到了形形的口令破解工具&#xff0c;这些工具中名气最大的就是ERD Commander Boot CD。 ERD Commander Boot CD是一张可以启动操…

【Qt】Qt5.9.0: error: GL/gl.h: 没有那个文件或目录

重新安装ubuntu&#xff0c;在编译Qt时报错&#xff1a; /home/Qt5.9.0/Examples/Qt-5.9/widgets/widgets/calculator/button.cpp:51: from …/calculator/button.cpp:51: /home/Qt5.9.0/5.9/gcc_64/include/QtGui/qopengl.h:139: error: GL/gl.h: 没有那个文件或目录 解决方…

给Chrome“捉虫”16000个,Google开源bug自检工具

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 在内部开发和使用八年之久&#xff0c;近日&#xff0c;Google 宣布开源 bug 自动化检测工具 ClusterFuzz。ClusterFuzz 是一款提供端到端的自动化模糊测试工具&#xff1a;从错误检测到分类排查&…

小巧的日志记录组件 - 开源研究系列文章

今天给大家带来一个小巧的日志记录组件LogHelper。这个组件是由Log4Net这个组件的由来而来的&#xff0c;不过只是写入.txt文本文件而已。如果能够对大家的项目有帮助那就更好了。 首先&#xff0c;打开.SLN解决方案&#xff0c;添加引用日志组件。 然后&#xff0c;先对日志组…

.NET开发人员值得关注的七个开源项目

微软近几年在.NET社区开源项目方面投入了相当多的时间和资源&#xff0c;不禁让原本对峙的开源社区阵营大吃一惊&#xff0c;从微软.NET社区中的反应来看&#xff0c;微软.NET开发阵营对开源工具的依赖正日益增强&#xff0c;本文就为所有.NET开发人员介绍7个应该关注的开源项目…

SystemTap了解

SystemTrap是监控和跟踪运行中的Linux内核操作的动态方法。 http://www.ibm.com/developerworks/cn/linux/l-systemtap/ 使用SystemTrap需要使用trap来运行一个stp脚本 如何安装&#xff1a; Centos下直接yum install systemtrap就行了 测试是否可以运行 运行&#xff1a;stap …

Windows 95被做成了App,可玩扫雷和纸牌

6 秒重温 Windows95 开机画面 作者 | 琥珀 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; “看到 Win95&#xff0c;再看到仙剑 DOS 的画面&#xff0c;突然有种想哭的感觉&#xff0c;小时候帮李逍遥实现了仗剑江湖的愿望&#xff0c;但自己却没有实现自己的愿望…

【Ubuntu】虚拟机VirtualBox安装win7完整步骤

在Ubuntu16.04中使用VirtualBox安装win7&#xff0c;亲测可以完美使用; 完整步骤参见如下链接&#xff1a; 1、VirtualBox安装步骤&#xff1a;http://www.xitongcheng.com/jiaocheng/xtazjc_article_23804.html 2、win7镜像下载&#xff1a;http://www.xitongcheng.com/jia…

全栈AI工程师指南,DIY一个识别手写数字的web应用

作者 | shadow chi本文经授权转载自 无界社区mixlab&#xff08;ID&#xff1a;mix-lab&#xff09;网上大量教程都是教如何训练模型&#xff0c;往往我们只学会了训练模型&#xff0c;而实际应用的环节是缺失的。def AIFullstack&#xff08; &#xff09;&#xff1a;本文从「…

mysql 中limit 用法!!

select * from mydb where id limit i,j; 意思就是从第i行开始&#xff0c;检索出j行&#xff0c;结束&#xff01;主要用于分页技术中&#xff0c;比如说我们一页现实10行&#xff0c;可以这样做&#xff1a;select * from mydb where id order by id desc limit $page,10($pa…

【Qt】Qt动态库和静态库的创建和使用

动态库(共享库)的创建 在Qt Creator中新建项目,选择Library 点击“Choose”进入下一步 选择创建库的类型:共享库 选择Kit套件 选择需要的模块 配置工程路径、名字等 Qt Creator自动创建的文件 我配置的动态库名字为:Share pro文件内容

23.3. Ethernet0/0 - Wan口配置

23.3.1. DHCP 动态IP地址 <Netkiller>system-view System View: return to User View with CtrlZ.interface Ethernet0/0port link-mode routenat outboundip address dhcp-allocipsec policy navigator #[Netkiller]display dhcp client Ethernet0/0 DHCP client inform…

用Python解锁“吃鸡”正确姿势

大吉大利&#xff0c;今晚吃鸡~ 今天跟朋友玩了几把吃鸡&#xff0c;经历了各种死法&#xff0c;还被嘲笑说论女生吃鸡的100种死法&#xff0c;比如被拳头抡死、跳伞落到房顶边缘摔死 、把吃鸡玩成飞车被车技秀死、被队友用燃烧瓶烧死的。这种游戏对我来说就是一个让我明白原来…

Oracle Grid Control 10.2.0.5 for Linux 安装和配置指南

一、概述&#xff1a;Grid Control的组件包括Management Agent, Management Service (OMS), Management Repository. 系统架构如下: 10g oem是一个基于web的管理架构&#xff0c;这和10g之前的笨重的java客户端有很大的区别。我们可以从2方面来研究它的架构&#xff0c;一个是管…

【Qt】Qt Plugin:Qt插件创建与使用

插件接口设计 以a+b=c的接口为例:int add(int a, int b) 在 主项目 工程中创建接口文件(一个头文件)eg:Add.h #ifndef ADD_H #define ADD_H#include <QtPlugin> class Add { public:virtual int add(int a, int b)= 0;//纯虚函数 }; Q_DECLARE_INTERFACE(Add, &qu…

9.5. SELINUX

禁用SElinux编辑/etc/selinux/config&#xff0c;修改如下内容&#xff1a; SELINUXdisabled使用命令 getenforce setenforce 0lokkit --selinuxdisabledPlease enable JavaScript to view the <a href"http://disqus.com/?ref_noscript">comments powered by…

说说我们为什么需要加班

做软件这行&#xff0c;加班就是家常便饭。做了这么多年程序员&#xff0c;我还真没听哪个说公司不加班的&#xff0c;碰见好的不时、偶尔加班&#xff0c;差的就是无尽的加。加班是那么的邪恶、令人作呕&#xff0c;但又无法抗拒&#xff0c;它仿佛就像嫖客患上梅毒——摆脱不…

为 Django admin 登录页添加验证码

为什么80%的码农都做不了架构师&#xff1f;>>> 历史原因&#xff0c;使用上古版本 django 1.6.5&#xff0c;但新版本应该大同小异 首先添加自定义后台模块app&#xff0c; 如adm&#xff0c;并添加到 INSTALLED_APPS 下。 假设处理自定义登录的view是 apps/adm/v…

手机芯片谁是AI之王?高通、联发科均超华为

整理 | apddd出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;尽管相当数量的人工智能服务&#xff0c;是由云计算网络提供&#xff0c;但在响应低延迟、保护隐私、应用场景等方面&#xff0c;手机AI芯片无可替代。例如人脸解锁&#xff0c;图像增强、识别&#xff0c…

【linux】error: stdio.h: No such file or directory

ubuntu 默认没有C和C编译环境 ubuntu 默认没有C和C编译环境&#xff0c;新装的ubuntu&#xff0c;使用gcc编译时&#xff0c;会报错&#xff0c;找不到某某头文件等。在编译一个demo&#xff0c;如hello world时&#xff0c;会报错&#xff1a; error: stdio.h: No such file …

SqlParameter的用法

1。一些面例子为例&#xff1a;List<SqlParameter> listp new List<SqlParameter>();listp.Add(new SqlParameter("userid", userid));string sql "select * from userbooks where useriduserid";在执行sql语句时 listp.Add(new SqlParamete…

程序员如何用“撞针“拯救35亿地球人?

春节假期即将结束&#xff0c;有多少程序员朋友已经离开家乡在返回北上广深等工作所在城市的路上&#xff1f;有多少程序员已经开工大吉开始了新一年的代码征程&#xff1f;回首这一个春节&#xff0c;8 部电影在大年初一齐上线&#xff0c;《流浪地球》在前期预售票房远不如《…

【linux】printf在终端打印彩色hello world

代码 #include <stdio.h>#define NONE "\033[m" #define RED "\033[0;32;31m" #define GREEN "\033[0;32;32m" #define BLUE "\033[0;32;34m" #define YELLOW "\033[1;33m&qu…

看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!

作者丨魏旸&#xff1a;腾讯高级工程师&#xff0c;15年运维经验的老专家&#xff0c;负责QQ空间、微云、QQ空间相册的运维工作&#xff0c;亲历8亿军装照、QQ空间异地多活建设等重大架构升级事件。2017年12月30日&#xff0c;元旦假期的第一天&#xff0c;你的朋友圈被18岁照片…

基于svnserve的SVN服务器(windows下安装与配置)

基于svnserve的SVN服务器(windows下安装与配置)关键字: svn 安装SVNserve 从http://subversion.tigris.org/servlets/ProjectDocumentList?folderID91得到最新版本的Subversion。 如果你已经安装了Subversion&#xff0c;svnserve已经运行&#xff0c;你需要在继续之前把它停…

【c语言】C语言配置文件解析库——iniparser

转载自&#xff1a;http://blog.csdn.net/u011192270/article/details/49339071 C语言配置文件解析库——iniparser前言&#xff1a;在对项目的优化时&#xff0c;发现Linux下没有专门的供给C语言使用的配置文件函数&#xff0c;于是搜索到了iniparser库&#xff0c;可以像那些…

利用java虚拟机的工具jmap分析java内存情况

2019独角兽企业重金招聘Python工程师标准>>> 有时候碰到性能问题&#xff0c;比如一个java application出现out of memory,出现内存泄漏的情况&#xff0c;再去修改bug可能会变得异常复杂&#xff0c;利用工具去分析整个java application 内存占用情况&#xff0c;然…