2022年8月

Nacos客户端开发和openfeign服务间通信


nacos客户端开发

1、新建一个模块springclouAlibaba-nacos-client-8989

image

2、导入相关依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency></dependencies><!--引入nacos client的依赖--><dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

3、编写application.properties配置文件

server.port=8989spring.application.name=NACOSCLIENT#指定服务名称spring.cloud.nacos.server-addr=47.106.105.80:8848

4、编写主启动类

package com.study.springcloudAlibaba;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClient   //开启服务的注册(可以省略不写)public class NacosClientApplication {    public static void main(String[] args) {
        SpringApplication.run(NacosClientApplication.class,args);
    }
}

5、启动测试

image

openfeign服务间的通信

一、消费者模块

1、新建一个提供者模块springcloudAlibaba-products-9090

image

2、导入相关依赖

 <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency></dependencies>

3、编写application.properties配置文件

server.port=9090spring.application.name=PRODUCTS#指定nacos server地址spring.cloud.nacos.server-addr=47.106.105.80:8848

4、编写主启动类

package com.sutdy.springcloudAlibaba;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ProductsApplication_9090 {    public static void main(String[] args) {
        SpringApplication.run(ProductsApplication_9090.class,args);
    }
}

5、编写controller层

package com.sutdy.springcloudAlibaba.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ProductsController {    @Value("${server.port}")
    private int port;    @GetMapping("/product/{id}")
    public String products(@PathVariable("id") Integer id){        return "调用商品服务返回:"+id+",当前提供服务的端口为:"+port;
    }
}

二、消费者模块

1、新建一个消费者模块springcloudAlibaba-users-8989

image

2、导入相关依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入nacos client的依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--导入openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

3、编写application.properties配置文件

server.port=8989spring.application.name=USERS#指定nacos server地址spring.cloud.nacos.server-addr=47.106.105.80:8848

4、编写主启动类,添加@EnableFeignClients注解开启Openfeign

package com.study.springcloudAlibaba;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication@EnableFeignClients //开启Openfeign调用支持public class UserApplication_8989 {    public static void main(String[] args) {
        SpringApplication.run(UserApplication_8989.class,args);
    }
}

5、编写openfeign客户端接口,添加@FeignClient("PRODUCTS")注解调用名称为"PRODUCTS"的微服务,实现服务之间的通信。

package com.study.springcloudAlibaba.feignclients;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;@FeignClient("PRODUCTS")public interface ProductClient {    @RequestMapping("/product/{id}")
    String product(@PathVariable("id") Integer id);
}

6、编写controller层实现服务通信接口

package com.study.springcloudAlibaba.controller;import com.study.springcloudAlibaba.feignclients.ProductClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserController {    @Autowired
    private ProductClient productClient;    @GetMapping("/invoke")
    public String invokeProduct(){        String result = productClient.product(21);        return "调用用户服务成功.....调用商品服务结果:{}"+result;
    }
}

三、启动测试

1、点击 编辑配置

image

2、选择ProductsApplication_9090,再点击复制

image

3、点击复制出来的ProductsApplication_9091,再点击配置,修改名称和端口号

image

4、启动服务提供者9090和9091,再启动消费者8989

image

5、进入 http://localhost:8989/invoke 页面

image

刷新
image


Nacos组件:环境配置


Nacos组件简介

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理

Nacos就是微服务架构中服务注册中心以及统一配置中心,用来替换原来的(eureka,consul)以及config组件

使用nacos必须安装JDK和maven

image

JDK安装

1、安装Nacos必须安装jdk,把rpm安装包的jdk上传到linux服务器上

image

2、输入rpm -ivh jdk-11.0.11_linux-x64_bin.rpm安装jdk

3、输入find / -name java查看java安装目录,进入bin目录,查看

image

4、输入vim /etc/profile配置linux系统环境变量,光标移到最后面按i键编辑添加环境变量

export JAVA_HOME=/usr/java/jdk-11.0.11
export PATH=$PATH:$JAVA_HOME/bin

image
按ESC,再按:wq保存退出

5、退出之后输入source /etc/profile重新加载环境变量

6、输入java -sersion查看是否配置成功

image

Maven安装

1、下载apache-maven-3.6.3-bin.tar.gz https://downloads.apache.org/maven/maven-3/

2、把tar包上传到linux系统的 /usr 目录下

3、输入tar -xvzf apache-maven-3.6.3-bin.tar.gz解压maven

image

4、输入vim /etc/profile命令打开环境变量配置

5、拉到最后面按i键配置环境变量

export MAVEN_HOME=/usr/apache-maven-3.6.3export PATH=$PATH:$MAVEN_HOME/bin

image

6、按ESC,再输入:wq保存并退出

7、执行source /etc/profile命令重新加载配置文件

8、输入mvn -v查看是否安装成功

image

Nacos安装

![image](uploading...)

输入cd返回root目录

1、下载Nacos安装包 https://nacos.io/zh-cn/index.html

2、把Nacos安装包上传到linux服务器上(我上传的是root文件夹)

image

3、nacaos是gz压缩包,输入tar -zxvf nacos-server-1.3.1.tar.gz解压缩到当前目录

image

4、查看nacos目录结构

image

5、启动nacos服务

ncaos默认集群启动,启动时单机启动,必须在bin目录中执行./startup.sh -m standalone
image

6、输入cd ..返回上一级目录,再输入tail -f logs/nacos.log查看日志,是否启动成功

7、访问nacos web地址 http://ip地址/8848/nacos

image

image


环境搭建


SpringCloudAlibaba简介

springcloud

spring团队开源微服务工具集,帮助我们快速构建分布式系统(微服务系统),提供spring组织 netflix

springcloud alibaba

alibaba团队开源微服务工具集,帮助我们快速构建分布式系统(微服务系统) 提供alibaba解决方案

springcloud alibaba是阿里云为分布式应用开发提供了一站式解决方案。它包含了开发分布式应用程序所需的所有组件,使您可以轻松地使用springcloud开发应用程序。
有了阿里云,你只需要添加一些注解和少量的配置,就可以将Spring云应用连接到阿里的分布式解决方案上,用阿里中间件搭建一个分布式应用系统。

spring cloud alibaba 特点

技术支持springcloud alibabaspringcloud netflix
服务降级和流量控制sentinelhystrix
服务注册与发现nacoseureka 、consul
分布式配置& 事件驱动消息总线nacosconfig & bus
分布式事务&dubboseta

springcloud 组件

技术支持springcloud alibabaspringcloud netflix
服务注册与发现组件nacoseureka consul
服务间通信组件restTemplate+ribbon,OpenfeignrestTemplate+ribbon,Openfeign
服务降级和熔断sentinelhystrix hystrix dashboard
服务网关组件gatewaygateway
统一配置中心组件 消息总线组件nacosconfig bus

微服务项目实战开发 springcloud netfilx + springcloud alibaba +springcloud spring

五大组件选择

  • 1.服务注册中心 ====> Nacos (alibaba)

  • 2.服务通信间的负载均衡 ====> RestTemplate+Ribbon (Netflix)或者Openfeign (Spring)

  • 3.服务熔断和服务降级 ====> sentinel (alibaba)

  • 4.服务网关组件 ====> Gateway (Spring)

  • 5.统一配置中心组件 ====>Nacos (alibaba)

SpringCloudAlibaba环境搭建

1、新建一个空项目

2、在空项目中新建一个模块

3、添加相关依赖

<!--继承springboot父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <!--定义版本号-->
    <properties>
        <spring.cloud.version>Hoxton.SR6</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <!--维护依赖-->
    <dependencyManagement>
        <dependencies>
        <!--维护springcloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        <!--维护springcloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


Log Parser(微软网站下载)是微软公司出品的日志分析工具,它功能强大,使用简单,可以分析基于文本的日志文件、XML 文件、CSV(逗号分隔符)文件,以及操作系统的事件日志、注册表、文件系统、Active Directory。它可以像使用 SQL 语句一样查询分析这些数据,甚至可以把分析结果以各种图表的形式展现出来。

Log Parser 的安装很简单,没有什么特别的,安装之后,可以在安装目录下找到 LogParser.chm 这个文件,该文件是 LogParser 的帮助文件,为英语语言。

我们简单介绍一下在命令提示符中如何使用 Log Parser。

LogParser.exe 为可执行文件,后跟一个使用 SQL 结构的语句参数进行查询。

C:Program FilesLog Parser 2.2>LogParser "SELECT TOP 10 * FROM System ORDER BY RecordNumber DESC"

从系统日志(可以从事件查看器中找到)中,选出按 RecordNumber 逆序的前 10 条记录。RecordNumber 是 System 中的一个字段。

我们也可以生成图表:

C:Program FilesLog Parser 2.2>LogParser "SELECT EventID, Count(*) as 出现次数 INTO Chart.gif FROM System GROUP BY EventID" -chartType:PieExploded3D -groupSize:500x350 -chartTitle:"事件分类"

上述代码中还加了其它参数来确定图表的类型、大小等,得到类似如下图表:

Log Parser 生成的图表

是不是非常的简单,而且很振奋人心,不过这些都不是我们介绍的重点,我们的重点是如何利用 C# 去执行 Log Parser。

通过 .NET Framework 的 COM interop (COM 交互操作)特性,可以很方便地在 .NET 应用程序中使用 Log Parser,.NET Framework 的 COM interop 是通过 Runtime Callable Wrappers (RCW) 来实现对 COM 的操作的,RCW 是 .NET 中的一个类。

我们用 Log Parser 和 C# 打造网站访问统计分析系统,就是用 C# 调用 Log Parser,利用 Log Parser 去分析 IIS 的日志文件。我们这里的日志文件是 W3C 格式的。

程序

我们建立一个 .cs 文件,引入:

using LogQuery = Interop.MSUtil.LogQueryClassClass; using IISInputFormat = Interop.MSUtil.COMIISW3CInputContextClassClass; using LogRecordSet = Interop.MSUtil.ILogRecordset;

类中关键代码如下:

LogQuery oLogQuery = new LogQuery(); IISInputFormat oIISInputFormat = new IISInputFormat(); string query = @"SELECT COUNT(DISTINCT c-ip) AS hits                   FROM 'C:WINDOWSsystem32LogfilesW3SVC1ex070820.log'                   WHERE cs-uri-stem like '%.asp'                   AND sc-status=200"; LogRecordSet oRecordSet = oLogQuery.Execute(query, oIISInputFormat); if (!oRecordSet.atEnd()) {     hits = (int)oRecordSet.getRecord().getValue("hits"); } oRecordSet.close();

看得出来跟使用数据库没有多大区别,查询语句中 c-ip、cs-uri-stem、sc-status 等都是日志文件的字段,直接打开日志文件可以找到这些内容。

编译

程序就完成了,不过还不能直接运行,我们还要对它编译,我们这里是编译成 exe,当然您也可以把它编译成一个 DLL,供 ASP.NET 一类的文件调用。

需要两步,第一步:

C:Program FilesMicrosoft Visual Studio 8SDKv2.0BinTlbImp.exe C:Program FilesLog Parser 2.2LogParser.dll /out:E:Interop.MSUtil.dll

直接下载 Interop.MSUtil.dll

TlbImp 全称是 Type Library Importer,它是用于创建 RCW,它通常位于 .NET Framework 的 Bin 目录下。

如果您使用的是 Visual Studio 2005,也可以不使用命令提示符的方式,而在工程中直接导入。

第二步:

C:WINDOWSMicrosoft.NETFrameworkv2.0.50727csc /target:exe /reference:E:Interop.MSUtil.dll /out:E:logAnal.exe E:logAnal.cs

logAnal.cs 是我们前面写的程序,logAnal.exe 是要生成的 exe 文件,Interop.MSUtil.dll 是前面生成的 DLL。

完成了

就是这么简单,没有什么复杂的,通过改变查询语句,可以实现多种统计。

1、导出为execl能打开的格式 logparser -i:evt -o:csv "select * from c:sec.evt" > d:sec.csv logparser -i:evt -o:csv "select * from security" > d:sec.csv logparser -i:evt -o:nat "select * into a.txt from security"logparser -i:evt -o:csv "select TimeGenerated,EventID,Message from c:sec.evt" > d:sec.csvlogparser -i:evt -o:TPL -tpl:EventLogs.tpl "select * into b.html from d:sec.evt"使用条件语句: SELECT TimeGenerated, EventTypeName, SourceName FROM System WHERE ( SourceName = 'Service Control Manager' AND EventID >= 7024) OR       ( SourceName = 'W32Time')SELECT * FROM Security WHERE Message LIKE '%logon%'A、在iis日志中搜索特殊链接 LogParser -o:csv "SELECT * into a.csv FROM iis.log where EXTRACT_EXTENSION(cs-uri-stem) LIKE 'asp'"B、最经典的例子,对日志中的url进行归并统计 LogParser -o:csv "SELECT cs-uri-stem, COUNT(*) into a.csv FROM iis.log GROUP BY cs-uri-stem"c、统计所有日志 LogParser -o:csv "SELECT cs-uri-stem, COUNT(*)into a.csv FROM ex*.log GROUP BY cs-uri-stem" LogParser -i:iisw3c -o:csv "SELECT cs-uri-stem, COUNT(*)into a.csv FROM *.log GROUP BY cs-uri-stem"d、对文件后缀进行排名 LogParser -i:iisw3c -o:csv "SELECT EXTRACT_EXTENSION(cs-uri-stem) AS PageType, COUNT(*) into a.cssv FROM *.log GROUP BY PageType"e、得到所有的不重复的链接 LogParser -i:iisw3c -o:csv "SELECT distinct cs-uri-stem into a.csv FROM *.log"  2、生成百分比饼图 LogParser "SELECT EventID, COUNT(*) AS Times INTO Chart.gif FROM d: mpsec.evt GROUP BY EventID ORDER BY Times DESC" -chartType:PieExploded3D -chartTitle:"Status Codes" 3、http日志 LogParser file:querytop.sql -o:chart -chartType:Bar3d -chartTitle:"TOP 10 URL"querytop.sql: SELECT TOP 10 cs-uri-stem AS Url,    COUNT(*) AS Hits INTO Urls.gif FROM <1> GROUP BY Url ORDER BY Hits DESC  4、在html页面里找关键字 Return the lines in an HTML document that contain links to other pages: LogParser "SELECT Text FROM http://www.microsoft.adatum.com WHERE Text LIKE '%href%'" -i:TEXTLINE  5、MD5 Hashes of System Files LogParser "SELECT Path, HASHMD5_FILE(Path) into a.txt FROM C:WindowsSystem32*.exe" -i:FS -recurse:0  6、Print the 10 largest files on the C: drive: LogParser "SELECT TOP 10 Path, Name, Size FROM C:*.* ORDER BY Size DESC" -i:FS  7、获得本机登陆帐户的查看 LogParser.exe -o:nat "SELECT RESOLVE_SID(Sid) AS Account FROM Security WHERE EventID IN (540; 528)"  8、获得系统日志的分类详细信息 LogParser "SELECT DISTINCT SourceName, EventID,SourceName,message INTO Event_*.csv FROM security" -i:EVT -o:CSV LogParser "SELECT DISTINCT SourceName, EventID,SourceName,message INTO Event_*.csv FROM System" -i:EVT -o:CSV 根据id分类 LogParser "SELECT DISTINCT eventid, EventID,SourceName,message INTO Event_*.csv FROM System" -i:EVT -o:CSV LogParser "SELECT DISTINCT eventid, EventID,SourceName,message INTO Event_*.csv FROM security" -i:EVT -o:CSV  9、生成图形界面日志 LogParser "SELECT 'Event ID:', EventID, SYSTEM_TIMESTAMP(),message FROM security" -i:EVT -o:datagrid  10、生成一个Web页面 LogParser file:d:EventLogs.sql?EventLog=security -o:TPL -tpl:d:EventLogs.tpl LogParser file:d:EventLogs.sql?EventLog=system -o:TPL -tpl:d:EventLogs.tpl  11、在iis日志里查看返回代码分布饼图 LogParser "SELECT sc-status, COUNT(*) AS Times INTO Chart.gif FROM iis.log GROUP BY sc-status ORDER BY Times DESC" -chartType:PieExploded3D -chartTitle:"Status Codes"   12、在所有日志中手机前10位的排名 LogParser file:querytop.sql -o:chart -chartType:Bar3d -chartTitle:"TOP 10 URL"querytop.sql:SELECT TOP 10 cs-uri-stem AS Url,    COUNT(*) AS Hits INTO Urls.gif FROM ex*.log GROUP BY Url ORDER BY Hits DESC   13、检索目录下所有文件的所有的信息 logparser "select * into a.csv from c:x-scan*.*" -i:fs -o:csv查看每个源IP发了多少个包 LogParser "SELECT srcip ,count(*) into a.csv FROM a.cap group by srcip" -fmode:tcpip -o:csv查看每个源端口的包的个数 LogParser "SELECT srcport ,count(*) into a.csv FROM a.cap group by srcport" -fmode:tcpip -o:csv归并所有srcip,dstip,srcport一样的包,得到个数 LogParser "SELECT srcip,dstip,srcport ,count(*) into a.csv FROM a.cap group by srcip,dstip,srcport" -fmode:tcpip -o:csv归并所有tcpflags的包 LogParser "SELECT srcip,srcport,dstip,dstport,tcpflags,count(*) into a.csv FROM a.cap where tcpflags='AF' group by srcip,srcport,dstip,dstport,tcpflags" -fmode:tcpip -o:csvtcpflags的分布饼图 LogParser "SELECT tcpflags,count(*) into a.gif FROM a.cap group by tcpflags " -fmode:tcpip -chartType:PieExploded3D -chartTitle:"Status Codes" LogParser "SELECT tcpflags,count(*) into a.csv FROM a.cap group by tcpflags " -fmode:tcpip -o:csv


需求:监控日志,如果有攻击,就把ip加入黑名单

分析:

1、打开日志文件

2、把ip地址拿出来

3、判断每一个ip出现的次数,如果大于50次的话,加入黑名单

4、每分钟读一次

log样式:

178.210.90.90 - - [04/Jun/2017:03:44:13 +0800] "GET /wp-includes/logo_img.php HTTP/1.0" 302 161 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"178.210.90.90 - - [04/Jun/2017:03:44:13 +0800] "GET /blog HTTP/1.0" 301 233 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"178.210.90.90 - - [04/Jun/2017:03:44:15 +0800] "GET /blog/ HTTP/1.0" 200 38278 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"66.249.75.29 - - [04/Jun/2017:03:45:55 +0800] "GET /bbs/forum.php?mod=forumdisplay&fid=574&filter=hot HTTP/1.1" 200 17482 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-"37.9.169.20 - - [04/Jun/2017:03:47:59 +0800] "GET /wp-admin/security.php HTTP/1.1" 302 161 "http://nnzhp.cn/wp-admin/s

实现:

import time
point = 0 #每次记录文件指针的位置while True:#持续读取实时更新的log
    all_IP = []
    f=open('access.log',encoding='utf-8')    #不能用read来直接读文件,文件从磁盘打开载入内存,进入cpu分析,若文件过大,内存会被占满,电脑回卡死
    f.seek(point)  # 移动文件指针,已统计过的IP不再额外统计
    for line in f:#直接循环一个文件对象的话,每次循环的是文件的每一行
        IP = line.split('-')[0].strip()#取出IP
        all_IP.append(IP)#将IP放入列表
    point = f.tell()  # 记录了指针的位置
    all_IP_set = set(all_IP)#集合天生去重
    for i in all_IP_set:#循环集合比循环列表效率高,已去重
        if all_IP.count(i) > 50:            print('加入黑名单的IP是%s,一分钟内出现了%s次'%(i,all_IP.count(i)))
    f.close()
    time.sleep(60)#每分钟读一次