为什么使用SpringCloud Alibaba
原因在于spring cloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装。然而Netflix的服务发现组件Eureka已经停止更新,而其他的众多组件预计会在明年(即2020年)停止维护。所以急需其他的一些替代产品,也就是spring cloud alibaba,目前正处于蓬勃发展的态式。
Nacos简介
官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
我在官网下了个nacos的服务
你也可以下一个下来跑在Windows本地,启动bin文件夹下的cmd命令文件!
具体其他资料请参考官网
启动成功之后输入:http://localhost:8848/nacos/,用户名密码都是nacos,进入注册中心的控制台.
通过nacos注册生产者
首先创建一个父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">
<parent>
<artifactId>springcloud-alibaba-learn</artifactId>
<groupId>com.zhbcm</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-discovery-provider</artifactId>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!--spring boot web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring-cloud-alibaba nacos服务注册/发现的依赖-->
<!--格式: spring-cloud-starter-[开源组织机构名字]-[项目模块名字]-->
<!--spring-cloud-starter-alibaba-sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--spring-boot-starter-actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<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>
<!-- spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--mybatis代码自动生成插件-->
<!--<plugin>-->
<!-- <groupId>org.mybatis.generator</groupId>-->
<!-- <artifactId>mybatis-generator-maven-plugin</artifactId>-->
<!-- <version>1.4.0</version>-->
<!-- <configuration>-->
<!-- <!–配置文件的位置–>-->
<!-- <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>-->
<!-- <!–生成代码过程中是否打印日志–>-->
<!-- <verbose>true</verbose>-->
<!-- <!–生成时是否覆盖java文件,xml文件总是合并–>-->
<!-- <overwrite>true</overwrite>-->
<!-- </configuration>-->
<!--</plugin>-->
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
</project>
这里有lombok依赖,所以你的idea里要有lombok插件,如果没有请去idea的插件市场去下
application.propertie配置
#\u5185\u5D4C\u7684web\u670D\u52A1\u5668\u7AEF\u53E3
server.port=8081
#\u670D\u52A1\u540D\u79F0
spring.application.name=nacos-discovery-provider
#nacos\u6CE8\u518C\u4E2D\u5FC3\u7684\u8FDE\u63A5\u5730\u5740
#spring.cloud.nacos.discovery.server-addr=192.168.172.128:8801,192.168.172.128:8802,192.168.172.128:8803
#spring.cloud.nacos.discovery.server-addr=192.168.172.128:80
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#nacos\u7684\u7528\u6237\u540D\u548C\u5BC6\u7801
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
#spring boot actuator \u76D1\u63A7\u548C\u5065\u5EB7\u68C0\u67E5\u529F\u80FD
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
#\u670D\u52A1\u96C6\u7FA4\u540D\u79F0
#spring.cloud.nacos.discovery.cluster-name=beijing
#\u670D\u52A1\u7684\u7248\u672C
#spring.cloud.nacos.discovery.metadata.version=v1
#\u670D\u52A1\u63D0\u4F9B\u80051\u662Fdev\u547D\u540D\u7A7A\u95F4
#spring.cloud.nacos.discovery.namespace=b91111e4-8a21-4c12-9a3f-cf40d93a8319
#\u6307\u5B9A\u6CE8\u518C\u65F6\u7684\u670D\u52A1\u5206\u7EC4\uFF0C\u7ECF\u6D4B\u8BD5\u6682\u65F6\u4E0D\u652F\u6301
#spring.cloud.nacos.discovery.group=DEV_GROUP
#\u6307\u5B9Asentinel-dashboard\u63A7\u5236\u53F0\u7684\u8FDE\u63A5\u5730\u5740
#spring.cloud.sentinel.transport.dashboard=192.168.172.128:8080
# 数据库驱动
#spring.datasource.url=jdbc:mysql://39.99.163.122:3306/workdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
#spring.datasource.username=mysql
#spring.datasource.password=UoT1R8[09/VsfXoO5>6YteB
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#\u914D\u7F6Ehttps\u7684\u7AEF\u53E3
#server.port=8443
#\u914D\u7F6Ehttps\u7684\u8BC1\u4E66
#server.ssl.key-store=classpath:tomcat.pkcs12
#\u8BC1\u4E66\u7684\u5BC6\u7801\uFF08\u5728\u751F\u6210\u8BC1\u4E66\u7684\u65F6\u5019\u4F1A\u6307\u5B9A\u4E00\u4E2A\u5BC6\u7801\uFF09
#server.ssl.key-store-password=123456
#\u6267\u884C\u8BC1\u4E66\u7684\u7C7B\u578B
#server.ssl.key-store-type=pkcs12
对外提供的接口
package com.zhbcm.nacos.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class EchoController
{
@GetMapping("/")
public ResponseEntity index()
{
log.info("provider /");
return new ResponseEntity("index", HttpStatus.OK);
}
@GetMapping("/test")
public ResponseEntity test()
{
log.info("provider /test");
return new ResponseEntity("test", HttpStatus.OK);
}
@GetMapping("/sleep")
public String sleep()
{
log.info("provider /sleep");
try
{
Thread.sleep(1000L);
} catch (InterruptedException e)
{
e.printStackTrace();
}
return "ok";
}
@GetMapping("/echo/{string}")
public String echo(@PathVariable String string)
{
log.info("provider /echo/{string}");
return "hello Nacos Discovery " + string;
}
@GetMapping("/divide")
public String divide(@RequestParam Integer a, @RequestParam Integer b)
{
log.info("provider /divide");
return String.valueOf(a / b);
}
@GetMapping("/notFound")
public String notFound()
{
System.out.println("provider 1 .........");
return "notFound";
}
}
启动类
package com.zhbcm.nacos;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient //开启服务注册与发现功能: classpath: META-INF/spring.factories文件
@SpringBootApplication
public class Application
{
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
启动成功之后,进入nacos的控制台看有没有服务实例
服务提供者整合完成
提供消费者
接着创建一个子模块
添加依赖
<?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>
<artifactId>springcloud-alibaba-learn</artifactId>
<groupId>com.zhbcm</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-discovery-consumer</artifactId>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!--spring boot web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot官方依赖: spring-boot-starter-xxx-->
<!-- springboot非官方依赖:xxx-spring-boot-starter-->
<!--springcloud依赖:spring-cloud-starter-xxx -->
<!--spring-cloud-alibaba 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--spring-boot-starter-actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--spring-cloud-starter-openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--spring-cloud-starter-openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<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.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
#\u5185\u5D4C\u7684web\u670D\u52A1\u5668\u7AEF\u53E3
server.port=8082
#\u5F53\u524D\u9879\u76EE\u7684\u670D\u52A1\u540D\u79F0
spring.application.name=nacos-discovery-consumer
#nacos\u6CE8\u518C\u4E2D\u5FC3\u96C6\u7FA4\u7684\u8FDE\u63A5\u5730\u5740
#spring.cloud.nacos.discovery.server-addr=192.168.172.128:8801,192.168.172.128:8802,192.168.172.128:8803
#spring.cloud.nacos.discovery.server-addr=192.168.172.128:80
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#nacos\u7684\u7528\u6237\u540D\u548C\u5BC6\u7801
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
#spring boot actuator \u76D1\u63A7\u548C\u5065\u5EB7\u68C0\u67E5\u529F\u80FD
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
#\u81EA\u5B9A\u4E49\u914D\u7F6E\uFF0C\u8FDC\u7A0B\u670D\u52A1\u63D0\u4F9B\u8005\u7684\u670D\u52A1\u540D
#service.name=http://29-nacos-discovery-provider
#\u901A\u8FC7\u914D\u7F6E\u6587\u4EF6\u6307\u5B9A\u8D1F\u8F7D\u5747\u8861\u7B56\u7565\uFF0C29-nacos-discovery-provider\u662F\u8FDC\u7A0B\u670D\u52A1\u63D0\u4F9B\u8005\u7684\u540D\u79F0\uFF0C\u4E2A\u6027\u5316\u9700\u6C42\uFF0C\u4E0D\u540C\u670D\u52A1\u91C7\u7528\u4E0D\u540C\u8D1F\u8F7D\u5747\u8861\u7B56\u7565
#29-nacos-discovery-provider.ribbon.NFLoadBalancerRuleClassName=com.bjpowernode.ribbon.MyNacosRule
#29-nacos-discovery-provider2.ribbon.NFLoadBalancerRuleClassName=com.bjpowernode.ribbon.MyNacosRule2
#iping\u7684\u7B56\u7565
29-nacos-discovery-provider.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl
29-nacos-discovery-provider2.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl
#\u6307\u5B9A\u96C6\u7FA4\u7684\u540D\u79F0
#spring.cloud.nacos.discovery.cluster-name=beijing
#\u914D\u7F6E\u670D\u52A1\u7684\u5143\u6570\u636E
spring.cloud.nacos.discovery.metadata.version=v2
spring.cloud.nacos.discovery.metadata.token=123456
spring.cloud.nacos.discovery.metadata.clientId=101
#\u670D\u52A1\u63D0\u4F9B\u80051\u662Fdev\u547D\u540D\u7A7A\u95F4
#spring.cloud.nacos.discovery.namespace=b91111e4-8a21-4c12-9a3f-cf40d93a8319
#\u6307\u5B9A\u6CE8\u518C\u65F6\u7684\u670D\u52A1\u5206\u7EC4\uFF0C\u7ECF\u6D4B\u8BD5\u6682\u65F6\u4E0D\u652F\u6301
#spring.cloud.nacos.discovery.group=DEV_GROUP
#\u5F00\u542F\u9965\u997F\u52A0\u8F7D\uFF0C\u4E00\u542F\u52A8\u5C31\u4ECE\u6CE8\u518C\u4E2D\u5FC3\u83B7\u53D6\u670D\u52A1\u8FDB\u884C\u7F13\u5B58\uFF0C\u9ED8\u8BA4\u662F\u61D2\u52A0\u8F7D
ribbon.eager-load.enabled=true
#\u4E3A\u54EA\u4E9B\u5BA2\u6237\u7AEF\u5F00\u542F\u9965\u997F\u52A0\u8F7D\uFF0C\u591A\u4E2A\u5BA2\u6237\u7AEF\u4F7F\u7528\u9017\u53F7\u5206\u9694\uFF08\u975E\u5FC5\u987B\uFF09
ribbon.eager-load.clients=29-nacos-discovery-consumer
#\u914D\u7F6Efeign\u7684\u8FDE\u63A5\u3001\u8BFB\u53D6\u8D85\u65F6\u65F6\u95F4
#feign.client.config.default.read-timeout=2
#feign.client.config.default.connect-timeout=2
#feign.client.config.default.logger-level=full
#\u914D\u7F6E\u8981\u8C03\u7528\u7684\u67D0\u4E2A\u5177\u4F53\u670D\u52A1\u63D0\u4F9B\u8005\u7684\u8D85\u65F6\u65F6\u95F4
feign.client.config.29-nacos-discovery-provider.read-timeout=5000
feign.client.config.29-nacos-discovery-provider.connect-timeout=5000
#\u914D\u7F6Efeign\u5E95\u5C42\u4F7F\u7528httpclient\u8FDB\u884C\u8FDC\u7A0B\u8C03\u7528\uFF0C\u9ED8\u8BA4feign\u4E5F\u662Fhttpclient
#feign\u7684\u8001\u7248\u672C\uFF0C\u5E95\u5C42\u662F\u91C7\u7528\u7684JDK\u7684httpURLconnection\u53D1\u8D77\u8FDC\u7A0B\u8C03\u7528\uFF0C\u6548\u7387\u4E0D\u5982RestTemplete\uFF0C\u73B0\u5728\u65B0\u7248\u672C\u6548\u7387\u90FD\u5DEE\u4E0D\u591A
feign.httpclient.enabled=true
feign.httpclient.max-connections=200
feign.httpclient.max-connections-per-route=50
#\u6307\u5B9Asentinel-dashboard\u63A7\u5236\u53F0\u7684\u8FDE\u63A5\u5730\u5740
#spring.cloud.sentinel.transport.dashboard=192.168.172.128:8080
#\u6307\u5B9A\u5FAE\u670D\u52A1\u4E0Esentinel-dashboard\u63A7\u5236\u53F0\u7684\u8FDE\u63A5\u7AEF\u53E3
#spring.cloud.sentinel.transport.port=8719
#true\u8868\u793A\u9965\u997F\u52A0\u8F7D
spring.cloud.sentinel.eager=true
#\u5173\u95EDsentinel\u5BF9controller\u7684url\u7684\u4FDD\u62A4
spring.cloud.sentinel.filter.enabled=true
#true\u5F00\u542Fsentinel\u5BF9resttemplate\u7684\u652F\u6301\uFF0Cfalse\u5219\u5173\u95ED
resttemplate.sentinel.enabled=true
#true\u5F00\u542Fsentinel\u5BF9feign\u7684\u652F\u6301\uFF0Cfalse\u5219\u5173\u95ED
feign.sentinel.enabled=true
#\u907F\u514Djava.lang.IllegalStateException: Incompatible fallback instance. Fallback/fallbackFactory of type class com.bjpowernode.service.EchoServiceFallback is not assignable to interface com.bjpowernode.service.FeignService for feign client baidu
spring.main.allow-bean-definition-overriding=true
#\u57FA\u4E8Enacos\u914D\u7F6E\u4E2D\u5FC3\u8FDB\u884C\u89C4\u5219\u6301\u4E45\u5316 (\u5229\u7528nacos\u914D\u7F6E\u4E2D\u5FC3\u6301\u4E45\u5316\u6D41\u63A7\u89C4\u5219)
#spring.cloud.sentinel.datasource.ds1.nacos.server-addr=192.168.172.128:80
#spring.cloud.sentinel.datasource.ds1.nacos.data-id=${spring.application.name}.json
#spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
#spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
#spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow
#\u914D\u7F6Ehttps\u7684\u7AEF\u53E3
#server.port=8444
#\u914D\u7F6Ehttps\u7684\u8BC1\u4E66
#server.ssl.key-store=classpath:tomcat.pkcs12
#\u8BC1\u4E66\u7684\u5BC6\u7801\uFF08\u5728\u751F\u6210\u8BC1\u4E66\u7684\u65F6\u5019\u4F1A\u6307\u5B9A\u4E00\u4E2A\u5BC6\u7801\uFF09
#server.ssl.key-store-password=123456
#\u6267\u884C\u8BC1\u4E66\u7684\u7C7B\u578B
#server.ssl.key-store-type=pkcs12
配置远程调用
package com.zhbcm.consumer.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author 朝花不迟暮
* @version 1.0
* @date 2021/3/8 23:13
*/
@Configuration
public class MyRibbonConfig
{
@Bean
// @LoadBalanced //负载均衡
public RestTemplate restTemplate()
{
return new RestTemplate();
}
}
下面还有一个feign调用远程接口的例子
feign调用服务端接口:
package com.zhbcm.consumer.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = "nacos-discovery-provider")
public interface EchoFeignService {
@GetMapping("/echo/hello")
default String hello() {
return "hello";
}
@GetMapping("/echo/{str}")
String echo(@PathVariable("str") String str);
@GetMapping("/divide")
String divide(@RequestParam("a") Integer a, @RequestParam("b") Integer b);
/**
* feign声明的接口可以有默认实现, 就是可以不需要远程服务提供者实现,自己实现了
*
* @param a
* @return
*/
default String divide(Integer a) {
System.out.println("consumer devide method......");
return divide(a, 1);
}
// restTemplate.getForObject("http://29-nacos-discovery-provider/sleep", String.class);
// @FeignClient(name = "29-nacos-discovery-provider")
// http://29-nacos-discovery-provider/notFound
// http://192.168.0.104:8081/notFound
// http://192.168.0.104:8082/notFound
@GetMapping("/notFound")
String notFound();
}
控制层
package com.zhbcm.consumer.controller;
import ch.qos.logback.core.util.ContextUtil;
import com.zhbcm.consumer.service.EchoFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
@RestController
@Slf4j
public class TestController
{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
//feign 的声明式调用
@Autowired
private EchoFeignService echoFeignService;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/echo/{app}")
public String echoAppName(@PathVariable("app") String app)
{
//使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-discovery-provider");
// http://192.168.0.104:18082/echo/{app}
String url = String.format("http://%s:%s/echo/%s", serviceInstance.getHost(), serviceInstance.getPort(), app);
System.out.println("request url:" + url);
return restTemplate.getForObject(url, String.class);
}
@GetMapping("/echo-rest/{str}")
public String rest(@PathVariable String str)
{
//restTemplate + @LoadBalanced 实现远程调用
return restTemplate.getForObject("http://29-nacos-discovery-provider/echo/" + str, String.class);
}
@GetMapping("/index")
public String index(HttpServletRequest request) throws Exception
{
/*for (int i=0; i<2; i++) {
String result = restTemplate.getForObject("http://29-nacos-discovery-provider/", String.class);
System.out.println("调用远程服务结果:" + System.currentTimeMillis() + result);
//TimeUnit.SECONDS.sleep(1);
}*/
System.out.println("X-Request-Id = " + request.getHeader("X-Request-Id"));
System.out.println("X-Request-red = " + request.getHeader("X-Request-red"));
System.out.println("color = " + request.getParameter("color"));
return restTemplate.getForObject("http://29-nacos-discovery-provider/", String.class);
}
@GetMapping("/test")
public String test()
{
//try {
//Thread.sleep(250);
//int a = 10 / 0;
/*} catch (Exception e) {
e.printStackTrace();
*//*if (!BlockException.isBlockException(e)) {
Tracer.trace(e);
}*//*
}*/
return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
}
@PostMapping("/test1")
public String test1()
{
//try {
//Thread.sleep(250);
//int a = 10 / 0;
/*} catch (Exception e) {
e.printStackTrace();
*//*if (!BlockException.isBlockException(e)) {
Tracer.trace(e);
}*//*
}*/
return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
}
@GetMapping("/test2/{app}")
public String test2(@PathVariable("app") String app)
{
System.out.println("/test2/{app} --> " + app);
return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
}
// @GetMapping("/test3/{app}")
// public String test3(@PathVariable("app") String app) {
// System.out.println("/test3/{app} --> " + app);
//
// ContextUtil.enter("test3");
// Entry entry = null;
// try {
// entry = SphU.entry("test3");
//
// //受sentinel保护的代码 start
// int a = 10 / 0;
// return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
// //受sentinel保护的代码 end
//
// } catch (BlockException e) {
// e.printStackTrace();
// //手动写上服务降级的代码
// if (e instanceof FlowException) {
// return "限流了...";
// } else if (e instanceof DegradeException) {
// return "熔断降级了...";
// }
// return "熔断了.....";
// //............
//
// } catch (ArithmeticException e) {
// //对 int a = 10 / 0; 异常的监控
// Tracer.trace(e);
// return "除数不能为0";
// } finally {
// if (entry != null) {
// entry.exit();
// }
// ContextUtil.exit();
// }
// }
//
// @GetMapping("/test4/{app}")
// @SentinelResource(value = "test4")
// public String test4(@PathVariable("app") String app) {
// return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
// }
//
// /**
// * blockHandler = "block", blockHandlerClass = MyBlockHandlerClass.class 处理限流和降级
// * fallback = "fallback", fallbackClass = MyFallbackClass.class 处理限流和降级
// *
// * @param a
// * @param b
// * @return
// */
// @GetMapping("/app") // 埋点:加入sentinel的监控
// //@SentinelResource(value = "app", fallback = "fallback", fallbackClass = MyFallbackClass.class)
//
// @SentinelResource(value = "app", blockHandler = "block", blockHandlerClass = MyBlockHandlerClass.class)
// public String app(@RequestParam(value = "a", required = false) String a,
// @RequestParam(value = "b", required = false) String b) {
// System.out.println("/app/--> " + a + "--" + b);
// return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
// }
@GetMapping("/test2")
public String test2()
{
return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
}
@GetMapping("/sleep")
public String sleep()
{
return restTemplate.getForObject("http://29-nacos-discovery-provider/sleep", String.class);
}
@GetMapping("/notFound-feign")
public String notFound()
{
return echoFeignService.notFound();
}
@GetMapping("/divide-feign")
public String divide(@RequestParam Integer a, @RequestParam Integer b)
{
return echoFeignService.divide(a, b);
}
@GetMapping("/divide-feign2")
public String divide(@RequestParam Integer a)
{
return echoFeignService.divide(a);
}
@GetMapping("/echo-feign/{str}")
public String feign(@PathVariable String str)
{
log.info("执行方法===echo-feign");
return echoFeignService.echo(str);
}
@GetMapping("/services/{service}")
public Object client(@PathVariable String service)
{
return discoveryClient.getInstances(service);
}
@GetMapping("/services")
public Object services()
{
System.out.println(discoveryClient.description());
System.out.println(discoveryClient.getOrder());
return discoveryClient.getServices();
}
}
== 例子后面会精简下==
启动类
package com.zhbcm.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients //开启feign
@EnableDiscoveryClient //开启nacos服务注册与发现
@SpringBootApplication
public class Application
{
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
上面都是些基本的代码,写过springcloud的入门级代码的朋友都可以轻松吸收!
测试
问题
最后在测试,通过restTemplate调用远程接口的时候报错
这个问题百度一下就出来了,配置restTemplate的时候,配置了负载均衡,他会自动找应用名
所以
码云链接: https://gitee.com/thirtyleo/springcloud-alibaba-learning.git