Nacos

API地址:https://nacos.io/zh-cn/docs/open-api.html#3.1
如果访问不到,就是被和谐了

1、什么是Nacos

服务发现、服务配置、服务管理平台
注册中心、配置中心、服务管理

2、Nacos注册中心

在这里插入图片描述
主流的注册中心大概就这五种,从各方面来说,Nacos > Eureka> Consul > Zookeeper > CoreDNS
Eurake之前市场占有率也很大,后来停更了,逐渐被Nacos或Consul替代,CoreNDS不了解,看图的话,应该也是不太行,Zookeper的话,目前不支持负载均衡,还需要集成第三方,所以选用的话,要不然就是Nacos,要不然就是Consul

3、Nacos Server部署

  1. 下载解压缩
    这里用windows版本,linux也是一样的,就不开虚拟机了
    下载地址:https://github.com/alibaba/nacos
  2. 修改startup.cmd
    下载解压好以后,默认是集群环境,本地测试先修改成单体的,编辑bin目录下的startup.cmd
    在这里插入图片描述

集群cluster改成单体standalone
在这里插入图片描述

  1. 启动

执行startup.cmd启动,可以看到默认访问地址

在这里插入图片描述
启动成功最后会提示Nacos started successfully in stand alone mode. use embedded storage在这里插入图片描述
访问提示的页面,成功访问
在这里插入图片描述
默认的账号密码都是nacos

4、Nacos Client

创建IDEA项目,引入依赖,配置环境,启动项目,查看是否注册成功
目录结构
在这里插入图片描述

4.1、引入依赖

要注意版本对应在这里插入图片描述
在这里插入图片描述

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
        <spring.boot.version>2.3.2.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
        <org.apache.httpcomponents.version>4.5.3</org.apache.httpcomponents.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>


    </dependencies>

    <dependencyManagement>

        <!-- spring cloud alibaba的版本管理,通过dependency完成继承 -->
        <dependencies>
            <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>

            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>${org.apache.httpcomponents.version}</version>
            </dependency>


            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring.boot.version}</version>
            </dependency>




        </dependencies>



    </dependencyManagement>

4.2、配置文件

stock-nacos

server:
  port: 8021
# nacos配置,服务注册中心配置
spring:
  application:
    name: stock-nacos   #微服务名称(注册到注册中心的名称)
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848   #服务地址,可不配,默认地址127.0.0.1:8848
      discovery:
        username: zhangsan  # nacos登录界面用户名,可不配,默认nacos
        password: pwd123  # nacos登录界面密码,可不配,默认nacos
        namespace: public  # nacos实例,可不配,默认public

order-nacos

server:
  port: 8020
# nacos配置,服务注册中心配置
spring:
  application:
    name: order-nacos   #微服务名称(注册到注册中心的名称)
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848   #服务地址,可不配,默认地址127.0.0.1:8848
      discovery:
        username: zhangsan  # nacos登录界面用户名,可不配,默认nacos
        password: pwd123  # nacos登录界面密码,可不配,默认nacos
        namespace: public  # nacos实例,可不配,默认public

启动项目order-nacosstock-nacos,注册成功
在这里插入图片描述

4.3、controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        //原本通过ip:localhost,换为stock-nacos,stock-nacos是服务注册到服务中心的服务名
        String msg=restTemplate.getForObject("http://stock-nacos/stock/reduct",String.class);
        return "Hello World"+msg;


    }


}

4.4、访问服务

访问order的服务:http://localhost:8020/order/add
在这里插入图片描述
后台
在这里插入图片描述
解决:
RestTemplate 添加负载均衡@LoadBalanced

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate=builder.build();
        return restTemplate;

    }

再次访问
在这里插入图片描述

4.5、负载均衡访问

更改stock的controller代码,加入端口号展示,方便查看是否实现了负载均衡(4.4中负载均衡注解已经加入了)

@RestController
@RequestMapping("/stock")
public class StockController {

    @Value("${server.port}")
    String port;

    @RequestMapping("reduct")
    public String reduct(){
        return "请求"+port+"成功";
    }

}

再启动一个服务:https://blog.csdn.net/a3562323/article/details/125190445
在这里插入图片描述
访问order地址,查看是否负载均衡成功:http://localhost:8020/order/add
可以看到,负载均衡成功
在这里插入图片描述

5、Nacos管理界面

5.1、命名空间

项目中有多个环境,例如开发、测试等,可以点击新增命名空间,添加新的
在这里插入图片描述
新增了两个,添加成功
在这里插入图片描述
配置文件中指定它的命名空间
在这里插入图片描述

5.2、服务详情

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

雪崩保护

  • 保护阈值:0-1之间的值,0关闭
  • 临时实例:spring.cloud.nacos.discovery.ephemeral=false 默认true,宕机后在服务列表中是否保留(一般的服务,挂掉后,过了一定时间,就会从服务列表消除)

true:非永久实例
false:永久实例

在这里插入图片描述
健康实例数/总实例数<保护阈值
保护阈值小于设置的阈值,就触发雪崩保护,会调用不健康的服务来支持服务,那就会有一个问题,既然不健康的服务都挂掉了,调用肯定也是访问不到的,那么还调用不健康的服务做什么。
感觉它的作用最多的就是,保证洪峰到来,依旧把一部分流量分配到不健康的服务,虽然客户体验不佳,但是保障了健康的服务不会崩掉,
雪崩保护了解就好,一般nacos也只是做服务注册中心来用,雪崩这种情况有熔断和降级来处理

5.3、配置信息

https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
在这里插入图片描述

6、Nacos集群

搭建伪集群
nacos默认是使用内存,为了保证数据一致性,使用外置的数据源mysql(5.7以上)
先使用nacos数据库脚本(nacos目录下的conf中,nacos-mysql.sql),创建一个nacos的数据库

6.1、配置数据源

下载linux需要的nacos安装包
解压缩后,准备三份,8849、8850、8851,复制粘贴就可以了,使用他们来做集群
在这里插入图片描述

  • 改变端口
    编辑application.properties,server.port
    在这里插入图片描述
  • 改变数据源
# 使用mysql数据源
spring.datasource.platform=mysql
  • 连接数量
# 连接数量
db.num=1
  • 数据库连接信息,要指定我们创建的nacos的数据库信息
db.url.0=jdbc:mysql://192.168.0.141:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

以上的信息,8849、8850、8851都要改,改成对应的端口号

6.2、节点配置

conf目录下,复制一个cluster.conf.example,命名为cluster.conf,然后编辑cluster.conf
配置我们6.1中完成的三个nacos集群信息

# 集群信息
127.0.0.1:8849
127.0.0.1:8850
127.0.0.1:8851

在这里插入图片描述
以上操作,参与集群的三个nacos都要操作

6.3、启动文件修改

编辑bin下面的startup.sh

  • 确认启动模式是集群模式cluster
    在这里插入图片描述
  • 修改服务内存
    测试用的,就不用那么大内存了,改小点
    在这里插入图片描述
 #JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
 JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

以上修改,三个nacos都改

6.4、启动服务

[root@localhost bin]# ./startup.sh 
/usr/java/jdk1.8.0_131/bin/java  -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/nacos/nacos8849/logs/java_heapdump.hprof -XX:-UseLargePages -Dnacos.member.list= -Djava.ext.dirs=/usr/java/jdk1.8.0_131/jre/lib/ext:/usr/java/jdk1.8.0_131/lib/ext -Xloggc:/usr/local/nacos/nacos8849/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/usr/local/nacos/nacos8849/plugins/health,/usr/local/nacos/nacos8849/plugins/cmdb -Dnacos.home=/usr/local/nacos/nacos8849 -jar /usr/local/nacos/nacos8849/target/nacos-server.jar  --spring.config.additional-location=file:/usr/local/nacos/nacos8849/conf/ --logging.config=/usr/local/nacos/nacos8849/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with cluster
nacos is starting,you can check the /usr/local/nacos/nacos8849/logs/start.out

已经启动了,查看日志信息

[root@localhost bin]# tail -f ../logs/start.out

我这里是报错了

Caused by: com.mysql.cj.exceptions.CJException: null,  message from server: "Host '192.168.0.156' is not allowed to connect to this MySQL server"
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:129)
	at com.mysql.cj.protocol.a.NativeProtocol.rejectProtocol(NativeProtocol.java:392)
	at com.mysql.cj.protocol.a.NativeProtocol.readServerCapabilities(NativeProtocol.java:518)
	at com.mysql.cj.protocol.a.NativeProtocol.beforeHandshake(NativeProtocol.java:404)
	at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1450)
	at com.mysql.cj.NativeSession.connect(NativeSession.java:165)
	at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:849)
	... 186 more

我这个报错原因是我连接的是远程的数据库,数据库没有开启远程连接

使用命令查看配置信息

use mysql;

select host from user where user = "root";

显示localhost
执行update user set host = '%' where user ='root'将Host设置为通配符%
然后再执行命令

use mysql;

select host from user where user = "root";

显示%
重新启动nacos,启动成功
在这里插入图片描述
在这里插入图片描述
查看状态,刚刚启动8849已经是在线状态了
在这里插入图片描述
启动50和51,全部上线成功
在这里插入图片描述

6.5、 nginx负载均衡

修改nginx配置

[root@localhost nginx]# vim conf/nginx.conf
    # nacos集群负载均衡
    upstream nacoscluster{
        server 127.0.0.1:8849;
        server 127.0.0.1:8850;
        server 127.0.0.1:8851;
    }


    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;


        location /nacos/ {
            proxy_pass http://nacoscluster/nacos/;
        }

在这里插入图片描述
通过nginx访问,访问成功
在这里插入图片描述

项目配置文件修改

修改相关配置文件的ip和端口,改为nginx的

server:
  port: 8021
# nacos配置,服务注册中心配置
spring:
  application:
    name: stock-nacos   #微服务名称(注册到注册中心的名称)
  cloud:
    nacos:
#      server-addr: 127.0.0.1:8848   #服务地址,可不配,默认地址127.0.0.1:8848
      server-addr: 192.168.0.157:8847   # nginx访问地址,使用了集群,通过nginx负载均衡,

7、负载均衡

负载均衡主要以下两种:

  • 客户端负载均衡
  • 服务端负载均衡

7.1、客户端负载均衡

1、客户端从注册中心拿到所有可用节点的列表;
2、客户端将拿到的列表结合在本地制定的负载均衡策略,分发到对应的服务;

7.2、服务端负载均衡

服务端负载均衡又分为软件和硬件,软件就是nginx,通过复杂均衡策略,分发请求到对应的服务注册中心(6.5),硬件是F5

7.3、Nacos默认的负载均衡Ribbon

1、 ribbon依赖

        <!-- nacos服务注册发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

nacos-discovery已经默认引入了ribbon的依赖,所以不用单独引入
在这里插入图片描述
2、 添加@LoadBalanced注解

RestTemplate 上面添加@LoadBalanced

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate=builder.build();
        return restTemplate;

    }

3、 请求修改为服务名

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        //修改为服务名
        String msg=restTemplate.getForObject("http://stock-nacos/stock/reduct",String.class);
        return "Hello World"+msg;


    }

4、ribbon负载均衡策略

所有负载均衡的父接口IRule

常用的负载均衡策略

  • RandomRule随机策略,随机选择一个服务实例。
stock-nacos: # nacos中的服务id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载均衡
  • RoundRobinRule轮询策略,按照顺序每个都轮流一次。
stock-nacos: # nacos中的服务id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #设置负载均衡
  • RetryRule重试策略,在轮询的基础上,如果调用一个服务,返回Null,也就是调用失败,就重新调用下一个服务。
ribbon:
  ConnectTimeout: 2000 # 请求连接的超时时间
  ReadTimeout: 5000 # 请求处理的超时时间
stock-nacos: # nacos 中的服务 id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载均衡
  • WeightedResponseTimeRule权重策略(如果要设置基于nacos的手动设置权重的方式,就要配置NacosRule而不是WeightedResponseTimeRule),响应时间越短的服务,权重越大,权重大的服务被选中的概率较大。
stock-nacos: # nacos中的服务id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
  • BestAvailableRule最小连接数策略,使用并发请求最小的服务实例。
stock-nacos: # nacos中的服务id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #设置负载均衡
  • ZoneAvoidanceRule默认规则,区域敏感策略,假如服务部署在北京和上海,如果你是在北京发起的请求,那就调用的是北京的这个服务,如果没有区域的概念,那就使用的是RoundRobinRule轮询策略。
stock-nacos: # nacos中的服务id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
  • AvailabilityFilteringRule可用性敏感策略,过滤掉非健康的服务实例,然后再选择连接数较小的服务实例
stock-nacos: # nacos中的服务id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule

7.3.1、修改默认的负载均衡策略

两种方式,配置类的方式和配置文件的方式

  1. 配置类的方式
    需要注意的是,配置类不能放在SpringBoot启动类的同级以及下级目录,因为SpringBoot默认扫描的是同级及下级目录,要放在扫描不到的地方,如果被扫描到了,会被所有服务应用,针对不同的服务,可能有不同的访问策略,所以要在springBoot启动类单独指定。

config

@Configuration
public class RibbonRandomRuleConfig {

    /**
     * 方法名一定要叫iRule
     * @return
     */
    @Bean
    public IRule iRule(){
    	//设置为随机
        return new RandomRule();
    }

}

启动类

//RibbonClients指定要使用自定义策略的服务(name)和配置类(configuration )
@RibbonClients(value = {
        @RibbonClient(name="stock-nacos",configuration = RibbonRandomRuleConfig.class)
})
@SpringBootApplication
//@EnableDiscoveryClient在新版的springboot中,不加也可以正常注册
@EnableDiscoveryClient
@RibbonClients(value = {
        @RibbonClient(name="stock-nacos",configuration = RibbonRandomRuleConfig.class)
})
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate=builder.build();
        return restTemplate;

    }

}

在这里插入图片描述

  1. 配置文件的方式

3.

配置文件中就不需要在启动类配置@RibbonClients,直接在配置文件中设置

stock-nacos:	# 调用的服务名
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule	#设置策略

设置为了nacos的权重策略
修改权重,8022的权重修改为5
在这里插入图片描述
可以看到,大多数都是访问到的8022,权重生效,权重只是提高它的概率,并不是说,每次都是
在这里插入图片描述

7.3.2、自定义负载均衡策略

继承AbstractLoadBalancerRule ,不用注解

public class CustomRule extends AbstractLoadBalancerRule {

    @Override
    public Server choose(Object o) {

        ILoadBalancer loadBalancer = this.getLoadBalancer();
        //获得当前请求的服务实例
        List<Server> reachableServers = loadBalancer.getReachableServers();
        //随机获取一个数
        int random = ThreadLocalRandom.current().nextInt(reachableServers.size());
        //获取某个服务实例
        Server server = reachableServers.get(random);
        //判断实例是否存活
        //if(server.isAlive()){
        //    return null;
        //}

        return server;
    }
}

可以使用配置类,也可以使用配置文件,配置文件方便一点,使用配置文件
指定自定义类

stock-nacos:
  ribbon:
    NFLoadBalancerRuleClassName: com.wzw.ribbon.rule

7.3.3、饥饿加载

第一次调用服务的时候比较慢,可以设置为项目启动就加载

ribbon:
  eager-load:
    # 指定哪些服务使用饥饿加载,多个使用逗号分隔
    clients: order-nacos
    # 开启ribbon饥饿加载
    enabled: true

7.4 Spring Cloud LoadBalancer

Spring Cloud LoadBalancer是Spring Cloud官方提供的客户端负载均衡器,用来替换ribbon,但是目前为止,它的负载均衡策略只有两中,轮询和随机
Spring官方提供了两种负载均衡的客户端:

  • RestTemplate:
    目前常用的服务调用客户端,默认依赖jdk的HTTP来接工具
  • WebClient
    从Spring WebFlux 5.0开始提供的一个非阻塞的基于响应式编程的http请求客户端工具,响应式编程基于reactor。目前使用量比较小

7.4.1 RestTemplate整合LoadBalancer

因为nacos-discovery默认引入了ribbon,需要先把ribbon排除掉或者禁用

  1. 排除ribbon
        <!-- nacos服务注册发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  1. 禁用
server:
  port: 8030
# nacos配置,服务注册中心配置
spring:
  application:
    name: order-service   #微服务名称(注册到注册中心的名称)
  cloud:
    nacos:
      #      server-addr: 127.0.0.1:8848   #服务地址,可不配,默认地址127.0.0.1:8848
      server-addr: 192.168.0.157:8847   # nginx访问地址,使用了集群,通过nginx负载均衡,
    # 不使用ribbon
    loadbalancer:
      ribbon:
        enabled: false
  1. 引入依赖
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- nacos服务注册发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--添加Loadbalancer依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
    </dependencies>

7.5、微服务调用组件Feign

接口调用的实现

  • Httpclient

Httpclient是Apache Jakarta Common下的子项目,高效、最新、功能丰富的支持Http协议的客户端编程工具包,支持HTTP协议最新版本和建议,比JDK自带的URLConnection,更易用和灵活,发送HTTP请求变的容易,提高开发效率

  • Okhttp

处理网络请求的开源项目,安卓端最火的轻量级框架,Square公司,用于代替HttpURLConnection和Apache HttpClient,拥有简洁的API、高效性能,支持多协议(HTTP/2和SPDY)

  • HttpURLConnection

HttpURLConnection是Java的标准类,继承自URLConnection,用于向网站发送GET请求、POST请求,使用比较复杂,不像HttpClient容易使用

  • RestTemplate、WebClient

RestTemplate是Spring提供的访问Rest服务的客户端,提供了多种便捷访问远程HTTP服务的方法,大大提高客户端的编写效率

Feign比上面集中方式更方便简洁

7.5.1、什么是Feign

Feign是Netflix开发的声明式、模板化的HTTP客户端,支持多种注解(Feign自带的注解或JAX-RS注解),可以更便捷、优雅的调用HTTP API。

Spring Cloud openfeign对Feign进行了增强,使其支持Spring MVC注解,还整合了Ribbon和Nacos,使得Feign的使用更加方便

7.5.2、Spring Cloud Alibaba整合Feign

  1. 引入依赖
        <!--引入openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  1. 添加feign接口和方法
/**
 * name:调用的rest的接口,所对应的服务名(注册中心的服务名)
 * path:调用的rest的接口,所对应的controller的 @RequestMapping,如果controller没有指定RequestMapping,不设置就可以
 */
@FeignClient(name = "stock-service",path = "/stock")
public interface StockFeignService {

    //声明需要调用的rest接口对应的方法,跟Mybatis的接口类似,要调用的方法,可以看做该方法的实现类,要调用的方法是什么样,这里就写成一样的接口
    @RequestMapping("/reduct")
    public String reduct();

}

在这里插入图片描述

  1. 调用端启动类添加注解@EnableFeignClients
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }

}

之前是使用Restemplate调用,现在使用OpenFeign,把Restemplate相关的都删掉

@RestController
@RequestMapping("/order")
public class OrderController {

/*    
	替换RestTemplate 
	@Autowired
    RestTemplate restTemplate;*/
    
    //使用Openfeign
    @Autowired
    StockFeignService stockFeignService;

    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        //String msg=restTemplate.getForObject("http://stock-nacos/stock/reduct",String.class);
        String msg = stockFeignService.reduct();
        return "Hello Feign"+msg;


    }


}

在这里插入图片描述

7.5.3、Spring Cloud OpenFeign自定义配置

  1. 日志配置

默认调用OpenFeign是没有任何日志输出的,OpenFeign提供了四种日志级别,默认是NONE不显示

  • NONE:性能最佳,适用生产,没有任何日志,默认值
  • BASIC:适用于生产环境追踪问题,只记录请求方法、URL、响应状态及执行时间
  • HEADERS:记录BASIC的基础上,记录请求和相应的header
  • FULL:适用开发和测试环境,记录请求和相应的header、body、和元数据
  1. 全局配置

定义配置类,制定日志级别

/**
 * 全局配置:使用 @Configuration 会将配置作用给所有服务提供方
 * 局部配置: 如果只想针对某个服务,就不要加@Configuration
 */
@Configuration
public class FeiginConfig {


    @Bean
    public Logger.Level feignLoggerLevel(){
        /**
         * - NONE:性能最佳,适用生产,没有任何日志,默认值
         * - BASIC:适用于生产环境追踪问题,只记录请求方法、URL、响应状态及执行时间
         * - HEADERS:记录BASIC的基础上,记录请求和相应的header
         * - FULL:适用开发和测试环境,记录请求和相应的header、body、和元数据
         */
        return Logger.Level.FULL;
    }

}
  1. 局部配置

和上面一样的配置类,但是不要使用@Configuration注解,在service中指定配置类

@FeignClient(name = "product-service",path = "/product",configuration = FeiginConfig.class)
public interface ProductFeignService {

}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值