后期筹备:

启动nacos和sentinel

提供者9003/9004 (以9003为样本)

新建cloudalibaba-provider-payment9003/9004

pom文件

<?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>mscloud03</artifactId>        <groupId>com.atguigu.springcloud</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>cloudalibaba-provider-payment9003</artifactId>    <dependencies>        <!--SpringCloud ailibaba nacos -->        <dependency>            <groupId>com.alibaba.cloud</groupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>        </dependency>        <dependency><!-- 引入本人定义的api通用包,能够应用Payment领取Entity -->            <groupId>com.atguigu.springcloud</groupId>            <artifactId>cloud-api-commons</artifactId>            <version>${project.version}</version>        </dependency>        <!-- SpringBoot整合Web组件 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <!--日常通用jar包配置-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies></project>

yml文件

server:  port: 9003spring:  application:    name: nacos-payment-provider  cloud:    nacos:      discovery:        server-addr: localhost:8848 #配置Nacos地址management:  endpoints:    web:      exposure:        include: '*'

配置9004的时候记得批改端口 

主启动类

@SpringBootApplication@EnableDiscoveryClientpublic class PaymentMain9003{    public static void main(String[] args) {            SpringApplication.run(PaymentMain9003.class, args);    }}

业务类

@RestControllerpublic class PaymentController{    @Value("${server.port}")    private String serverPort;    public static HashMap<Long,Payment> hashMap = new HashMap<>();    static    {        hashMap.put(1L,new Payment(1L,"28a8c1e3bc2742d8848569891fb42181"));        hashMap.put(2L,new Payment(2L,"bba8c1e3bc2742d8848569891ac32182"));        hashMap.put(3L,new Payment(3L,"6ua8c1e3bc2742d8848569891xt92183"));    }    @GetMapping(value = "/paymentSQL/{id}")    public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id)    {        Payment payment = hashMap.get(id);        CommonResult<Payment> result = new CommonResult(200,"from mysql,serverPort:  "+serverPort,payment);        return result;    }}

测试1

启动9003拜访

消费者84

新建cloudalibaba-consumer-nacos-order84 

pom文件

<?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>mscloud03</artifactId>        <groupId>com.atguigu.springcloud</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>cloudalibaba-consumer-nacos-order84</artifactId>    <dependencies>        <!--SpringCloud ailibaba nacos -->        <dependency>            <groupId>com.alibaba.cloud</groupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>        </dependency>        <!--SpringCloud ailibaba sentinel -->        <dependency>            <groupId>com.alibaba.cloud</groupId>            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>        </dependency>        <!-- 引入本人定义的api通用包,能够应用Payment领取Entity -->        <dependency>            <groupId>com.atguigu.springcloud</groupId>            <artifactId>cloud-api-commons</artifactId>            <version>${project.version}</version>        </dependency>        <!-- SpringBoot整合Web组件 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <!--日常通用jar包配置-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies></project>

yml文件

server:  port: 84spring:  application:    name: nacos-order-consumer  cloud:    nacos:      discovery:        server-addr: localhost:8848    sentinel:      transport:        #配置Sentinel dashboard地址        dashboard: localhost:8080        #默认8719端口,如果被占用会主动从8719开始顺次+1扫描,直至找到未被占用的端口        port: 8719#消费者将要去拜访的微服务名称(注册胜利进nacos的微服务提供者)service-url:  nacos-user-service: http://nacos-payment-provider

主启动

@EnableDiscoveryClient@SpringBootApplicationpublic class OrderNacosMain84{    public static void main(String[] args) {            SpringApplication.run(OrderNacosMain84.class, args);    }}

配置类

@Configurationpublic class ApplicationContextConfig{    @Bean    @LoadBalanced    public RestTemplate getRestTemplate()    {        return new RestTemplate();    }}

业务类1

@RestController@Slf4jpublic class CircleBreakerController{    public static final String SERVICE_URL = "http://nacos-payment-provider";    @Resource    private RestTemplate restTemplate;    @RequestMapping("/consumer/fallback/{id}")    @SentinelResource(value = "fallback")      public CommonResult<Payment> fallback(@PathVariable Long id)    {        CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id);        if (id == 4) {            throw new IllegalArgumentException ("IllegalArgumentException,非法参数异样....");        }else if (result.getData() == null) {            throw new NullPointerException ("NullPointerException,该ID没有对应记录,空指针异样");        }        return result;    }}

测试2

启动9003 9004 84

拜访

 再拜访

能够发现第一次是9004端口,第二次是9003端口,这外面的话,就能够就晓得意见实现了ribbon中的轮训

测试3

给客户error页面,不敌对 

批改业务类(只配置fallback)

@RestController@Slf4jpublic class CircleBreakerController{    public static final String SERVICE_URL = "http://nacos-payment-provider";    @Resource    private RestTemplate restTemplate;    @RequestMapping("/consumer/fallback/{id}")    @SentinelResource(value = "fallback",fallback = "handlerFallback") //fallback负责业务异样    public CommonResult<Payment> fallback(@PathVariable Long id)    {        CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id);        if (id == 4) {            throw new IllegalArgumentException ("IllegalArgumentException,非法参数异样....");        }else if (result.getData() == null) {            throw new NullPointerException ("NullPointerException,该ID没有对应记录,空指针异样");        }        return result;    }    public CommonResult handlerFallback(@PathVariable  Long id,Throwable e) {        Payment payment = new Payment(id,"null");        return new CommonResult<>(444,"兜底异样handlerFallback,exception内容  "+e.getMessage(),payment);    }}

本例sentinel无配置

测试4

这里能够发现没有呈现error界面,而是咱们本人配置的兜底的解决计划 

批改业务类(只配置blockHandler )

@RestController@Slf4jpublic class CircleBreakerController{    public static final String SERVICE_URL = "http://nacos-payment-provider";    @Resource    private RestTemplate restTemplate;    @RequestMapping("/consumer/fallback/{id}")     @SentinelResource(value = "fallback",blockHandler = "blockHandler") //blockHandler负责在sentinel外面配置的降级限流    public CommonResult<Payment> fallback(@PathVariable Long id)    {        CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id);        if (id == 4) {            throw new IllegalArgumentException ("非法参数异样....");        }else if (result.getData() == null) {            throw new NullPointerException ("NullPointerException,该ID没有对应记录");        }        return result;    }    public CommonResult handlerFallback(@PathVariable  Long id,Throwable e) {        Payment payment = new Payment(id,"null");        return new CommonResult<>(444,"fallback,无此流水,exception  "+e.getMessage(),payment);    }    public CommonResult blockHandler(@PathVariable  Long id,BlockException blockException) {        Payment payment = new Payment(id,"null");        return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException  "+blockException.getMessage(),payment);    }}

配置sentinel

测试5

批改业务类(fallback和blockHandler都配置)

@RestController@Slf4jpublic class CircleBreakerController{    public static final String SERVICE_URL = "http://nacos-payment-provider";    @Resource    private RestTemplate restTemplate;    @RequestMapping("/consumer/fallback/{id}")     @SentinelResource(value = "fallback",fallback = "handlerFallback",blockHandler = "blockHandler")    public CommonResult<Payment> fallback(@PathVariable Long id)    {        CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id);        if (id == 4) {            throw new IllegalArgumentException ("非法参数异样....");        }else if (result.getData() == null) {            throw new NullPointerException ("NullPointerException,该ID没有对应记录");        }        return result;    }    public CommonResult handlerFallback(@PathVariable  Long id,Throwable e) {        Payment payment = new Payment(id,"null");        return new CommonResult<>(444,"fallback,无此流水,exception  "+e.getMessage(),payment);    }    public CommonResult blockHandler(@PathVariable  Long id,BlockException blockException) {        Payment payment = new Payment(id,"null");        return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException  "+blockException.getMessage(),payment);    }}

测试 6

再拜访的时候,那就意味着这个时候会被限流解决 

若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 解决逻辑。 

批改业务类(疏忽属性.......) 

@RestController@Slf4jpublic class CircleBreakerController{    public static final String SERVICE_URL = "http://nacos-payment-provider";    @Resource    private RestTemplate restTemplate;    @RequestMapping("/consumer/fallback/{id}")    @SentinelResource(value = "fallback", fallback = "handlerFallback", blockHandler = "blockHandler",            exceptionsToIgnore = {IllegalArgumentException.class})    public CommonResult<Payment> fallback(@PathVariable Long id)    {        CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id);        if (id == 4) {            throw new IllegalArgumentException ("非法参数异样....");        }else if (result.getData() == null) {            throw new NullPointerException ("NullPointerException,该ID没有对应记录");        }        return result;    }    public CommonResult handlerFallback(@PathVariable  Long id,Throwable e) {        Payment payment = new Payment(id,"null");        return new CommonResult<>(444,"fallback,无此流水,exception  "+e.getMessage(),payment);    }    public CommonResult blockHandler(@PathVariable  Long id,BlockException blockException) {        Payment payment = new Payment(id,"null");        return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException  "+blockException.getMessage(),payment);    }}

测试7