sentinel组件的安装和使用


Sentinel简介

随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流量”为突破口,在流量控制、断路、负载保护等多个领域进行工作,保障服务可靠性。

通俗来讲:用来在微服务系统中保护微服务对的作用 如何 服务雪崩 服务熔断 服务降级 就是用来替换hystrix

特性

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等

  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
    imge

sentinel提供了两个服务组件:

一个是 sentinel 用来实现微服务系统中服务熔断、降级等功能。 这点和hystrix 类似
一个是 sentinel dashboard 用来监控微服务系统中流量调用等情况 流控 熔断 降级 配置。 这点和hystrix dashboard类似

Sentinel的构建

1、下载Sentinel https://github.com/alibaba/Sentinel/

image

2、上传到linux服务器

3、启动

java -Dserver.port=9191 -jar  sentinel-dashboard-1.7.2.jar

4、访问9191端口的web管理页面

image

5、输入账号密码为sentinel进行登陆

image

Sentinel的使用

1、停止nacos集群

2、启动nacos单机模式

./nacos/bin/startup.sh -m standalone

3、新建一个子模块springcloudAlibaba-sentinel-8998

4、添加相关依赖

    <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>
        <!--引入sentinel依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
    </dependencies>

5、编写配置文件

server.port=8998spring.application.name=SENTINEL#nacos server地址spring.cloud.nacos.server-addr=localhost:8848#开启sentinel保护spring.cloud.sentinel.enabled=true#指定sentinel dashboard web管理地址spring.cloud.sentinel.transport.dashboard=localhost:9191#指定sentinel组件与sentinel dashboard通信地址#dashboard端口号默认8719spring.cloud.sentinel.transport.port=8719

6、编写controller

package com.study.springcloudAlibaba.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class DemoController {    @RequestMapping("/demo")
    public String demo(){        return "demo ok!!!";
    }
}

7、启动项目,调用一次/demo,再去观察sentinel

image
image

Sentinel中对系统保护的五大规则

一、流控规则:流量控制(flow control

  • 其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

二、降级规则:熔断降级(Degrade Service)

  • 其原理是监控应用中的资源调用请求,达到指定阀值时自动出发熔断降级

三、热点规则:热点参数规则(ParamFlow)

  • 其原理是很多时候我们希望统计某个热点数据中访问频次最高的 TOP K 数据,并对其进行限制

四、系统规则:系统自适应限流(SysetmFlow)

  • 其原理是 Sentinel 系统自适应限流从整体维度对应用入口流量进行控制

五、授权规则:来源访问控制(黑白名单)规则(AuthorityRule)

  • 很多时候,我们需要根据调用来源来判断次该请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求(origin)限制资源是否通过,若配置白名单则只有请求来源白名单内时才可通过;若配置黑名单则请求所在黑名单时不通过,其余的请求通过。


nacos的集群搭建和负载均衡


nacos集群概念

统一种软件服务的多个节点对一个系统提供服务称之为这个软件服务集群

imge

预备环境准备

  • 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。

  • 64 bit JDK 1.8+;

  • Maven 3.2.x+;

  • 3个或3个以上Nacos节点才能构成集群。

nacos集群搭建

集群规划

  • nacos01 端口号8845

  • nacos02 端口号8846

  • nacos03 端口号8847

  • mysql 端口号3306

  • nginx 端口号8999

搭建nacos集群注意事项:数据持久化必须配置为mysql数据持久化

1、把前面的nacos原始数据清空

rm -rf nacos/data/

2、复制三份nacos

cp -r nacos nacos01
cp -r nacos nacos02
cp -r nacos nacos03

image

3、清空nacos持久化到mysql的数据(删除所有表和字段,重新导入原数据)。注意:数据库中不能存在原始数据

4、把nacos conf目录中cluster.conf.example文件修改成cluster.conf

mv nacos01/conf/cluster.conf.example nacos01/conf/cluster.conf
mv nacos02/conf/cluster.conf.example nacos02/conf/cluster.conf
mv nacos03/conf/cluster.conf.example nacos03/conf/cluster.conf

5、修改nacos conf目录中cluster.conf文件添加所有集群节点(先删除里面所有信息)

vim nacos01/conf/cluster.conf
vim nacos02/conf/cluster.conf
vim nacos03/conf/cluster.conf

添加内容

#ip地址加端口号47.106.105:8845
47.106.105:8846
47.106.105:8847

6、查看是否修改成功,保证三个nacos服务器都有所有的集群节点

cat nacos01/conf/cluster.conf
cat nacos02/conf/cluster.conf
cat nacos03/conf/cluster.conf

7、修改所有nacos各自的端口号和指定启动ip

vim nacos01/conf/application.properties #8845
vim nacos02/conf/application.properties #8846
vim nacos03/conf/application.properties #8847

image

8、因为根据linux运行内存修改

image

9、启动以集群方式启动所有nacos服务,查看启动日志

启动8845端口

./nacos01/bin/startup.sh
tail -f nacos01/logs/nacos.log

启动8846端口

./nacos02/bin/startup.sh
tail -f nacos02/logs/nacos.log

启动8847端口

./nacos03/bin/startup.sh
tail -f nacos03/logs/nacos.log

image

nginx实现负载均衡

1、安装nginx

https://www.cnblogs.com/luoxiao1104/p/14978515.html

2、在sbin目录下停止nginx

./nginx -s stop

3、进入nginx的conf目录,编辑nginx.conf配置文件

vim nginx.conf

image

4、进入到sbin目录 执行nginx,必须要带上绝对路径

image

5、查看是否启动成功和加载配置文件

image

测试访问网页
image

6、项目修改

image


nacos的mysql持久化


nacos 持久化

持久化:管理的配置信息持久化
注意:默认nacos存在的配置信息持久化,默认的持久化方式为内嵌数据库derby
缺点:无法展示数据

官方建议:在生产情况下推荐将配置存入mysql数据库 注意:nacos到目前为止仅仅支持mysql

mysql安装

1、输入vi /etc/yum.repos.d/mysql-community.repo添加官方的yum源创建并编辑mysql-community.repo文件

vi /etc/yum.repos.d/mysql-community.repo

2、粘贴以下内容到源文件中

[mysql57-community]name=MySQL 5.7 Community Serverbaseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/enabled=1gpgcheck=0gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

3、安装mysql

yum install mysql-community-server -y

4、启动mysql数据库

systemctl start mysqld

5、修改mysql数据库密码

grep 'temporary password' /var/log/mysqld.log         获取初始密码
mysqladmin -u root -p password                        回车 输入原始密码 在输入新的密码

6、登录mysql

mysql -uroot -p密码

7、修改远程连接

grant all privileges on *.* to 'root'@'%' identified by '密码' with grant option;
flush privileges;          刷新权限

8、测试连接
image

nacos持久化数据库

1、创建一个数据库nacos
image

2、添加表,可以在linux服务器里面去出来添加到windows系统中
image

3、用sqlyog打开,把sql语句执行一遍得到表
image

4、修改nacos配置文件持久化信息到mysql中

  • 1.linux服务器进入到nacos/conf文件夹

  • 2.输入vim application.properties编辑配置文件

  • 3.image

  • 4.退出到nacos目录输入./bin/shutdown.sh停止nacos服务

  • 5.再输入./bin/startup.sh -m standalone启动nacos单机服务

  • 6.输入tail -f logs/nacos.log查看日志,查看nacos是否启动成功

5、打开nacosweb管理页面发现配置列表没有配置了,因为nacos把数据持久化到mysql里面,需要重新编写配置文件,并且修改bootstrap.proerties的命名空间id


配置中心及自动刷新


配置中心configclient开发

nacos作为统一配置中心:
1.它管理的配置文件方式是在自己所在的服务器上形成一个版本库,因此不需要再创建远程版本库
2.nacos作为统一配置中心管理配置文件时,同样也存在版本控制

1、创建一个config客户端子模块springcloudAlibaba-config-client-8888

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>
        <!--nacos config client-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

3、编写主启动类

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

4、进入nacos管理页面添加配置文件

  • 1.新建命名空间
    image

  • 2.输入命名空间信息
    image

  • 3.点击 配置管理,再点击 配置列表
    image

  • 4.选择study命名空间
    image

  • 5.点击+按钮
    image

  • 6.编辑配置文件
    image

  • 7.编辑完成点 发布
    image

5、编写bootstrap.properties配置文件,拉取远端配置

#告诉config server地址spring.cloud.nacos.server-addr=localhost:8848#告诉从哪个命名空间获取配置spring.cloud.nacos.config.namespace=f15dc566-c615-4dbe-88f9-0c812ea6e2f6#告诉从哪个组进行配置获取spring.cloud.nacos.config.group=DEFAULT_GROUP#第一种拉取远端配置文件方式#从哪个组拉取哪个配置文件spring.cloud.nacos.config.name=configclient-dev#拉取这个名字的哪个后缀文件spring.cloud.nacos.config.file-extension=properties#第一种拉取远端配置文件方式#spring.cloud.nacos.config.prefix=configclient#spring.profiles.active=dev#spring.cloud.nacos.config.file-extension=properties

6、编写controller层

package com.study.springcloud.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class DemoController {    @Value("${constomer.username}")
    private String username;    @GetMapping("/demo")
    public String demo(){        return "demo ok!!!"+username;
    }
}

7、启动测试

image

配置自动刷新

1、在controller层添加@RefreshScope实现自动刷新

image

2、修改远端配置文件

image

3、重新访问

image


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