一,Nacos注册中心下载与安装
1.下载安装
https://gitee.com/mirrors/Nacos?_from=gitee_search //码云上下载的更快一点
打开下载文件的根目录输入
cmd
打开命令窗输入打包命令。
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
2.启动
全部打包完成后可以开始启动项目
进入到此目录:
E:\ZouWorkSpace\MyTest\Nacos\distribution\target\nacos-server-1.4.1\nacos\bin
或者cd distribution/target/nacos-server-$version/nacos/bin
在此目录下cmd打开命令窗口
windows系统下执行:cmd startup.cmd -m standalone
(注意有坑,1.如果此命令无效,直接输入startup.cmd -m standalone
,2,此命令为单机模式启动,如果直接双击文件启动可能会报错)
Lunix系统下执行:sh startup.sh -m standalone
启动完毕后:
http://locahost:8848/nacos
可直接进去Nacos登录界面(账号密码皆为:nacos)
3.Nacos的配置
如果我们在项目中使用yml格式的配置文件时,我们需要在此配置格式。
添加如下配置
以上Nacos注册服务中心就初步完成了,下面我们来写服务提供者。
二,创建服务提供者
1,新建父类管理依赖。
1,新建文件夹
spring-cloud-alibaba
2, 在idea中打开该文件夹,在此目录下新建
pom.xml
文件,导入相关依赖,如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zpa.alibaba</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>alibaba-provider2</module>
<module>alibaba-provider1</module>
</modules>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
一定要主要版本搭配,不然会报错。具体参考此链接,也有配置,依赖相关的文档:
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
2,新建服务提供者
1,在
spring-cloud-alibaba
文件下新建—>Module—>Maven—>创建项目alibaba-provider1
2,pom.xml中无需导入依赖。
<?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>spring-cloud-alibaba</artifactId>
<groupId>com.zpa.alibaba</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>alibaba-provider2</artifactId>
</project>
3, 在java目录下新建项目包
com.zpa.alibaba
,在包目录下新建项目的启动类。
package com.zpa.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Author user
*/
@SpringBootApplication
@EnableDiscoveryClient
public class Provider1Application {
public static void main(String[] args) {
SpringApplication.run(Provider1Application.class,args);
}
}
4, 在resources目录下新建
application.yml
配置文件5,如配置文件不是小绿叶图标,File–>Project Structure–>Module–>,,,输入application搜索添加即可
6,在配置中导入配置文件内容
server:
port: 8700 #项目端口
spring:
application:
name: alibaba-provider1 #项目名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 #注册中心Nacos路径端口
management:
endpoints:
web:
exposure:
include: "*" #健康状态监测
项目结构目录如下(具体实现方法自己去写)
7,启动项目,然后在Nacos注册中心下服务列表下可查看是否已注册。
8,简单创建一个controller,方便待会消费者测试。
package com.zpa.alibaba.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author user
*/
@RestController
public class HelloProvider1 {
@GetMapping(value = "/hello/{message}")
public String HelloProvider1(@PathVariable String message) {
return "Hello" + message;
}
}
9,服务提供者创建完毕。
三,创建服务消费者
1,往父类添加消费者
openfeign
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2,在
spring-cloud-alibaba
文件下新建—>Module—>Maven—>创建项目alibaba-consumer1
3,java目录下创建
Consumer1Application
启动类,添加@EnableFeignClients
注解
package com.zpa.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @Author user
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Consumer1Application {
public static void main(String[] args) {
SpringApplication.run(Consumer1Application.class,args);
}
}
4,在resources目录下新建
application.yml
配置文件
server:
port: 8701
spring:
application:
name: alibaba-consumer1
cloud:
nacos:
discovery:
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: "*"
5,创建
service
接口
package com.zpa.alibaba.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @Author user
*/
@FeignClient(value = "alibaba-provider1")
public interface Provider1Service {
@GetMapping(value = "/hello/{message}")
String hello(@PathVariable(value = "message") String message);
}
6,创建controller接口
package com.zpa.alibaba.controller;
import com.zpa.alibaba.service.Provider1Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author user
*/
@RestController
public class Consumer1Controller {
@Autowired
private Provider1Service provider1Service;
@GetMapping(value = "/hello")
public String HelloProvider1() {
return provider1Service.hello("hahahahahahah ");
}
}
7,访问
http://localhost:8701/hello
接口
8,消费者创建完毕!
四,Sentinel的简单使用
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
启动方式
下载Sentinel后在E:\ZouWorkSpace\MyTest\Sentinel\sentinel-dashboard\target>文件下cmd窗口输入
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
消费者yml配置类
server:
port: 8701
spring:
application:
name: alibaba-consumer1
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
port: 8719
dashboard: localhost:8080
feign:
hystrix:
enabled: true
management:
endpoints:
web:
exposure:
include: "*"
消费者接口类
package com.zpa.alibaba.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.zpa.alibaba.fallback.CustomerFallback;
import com.zpa.alibaba.blockHandler.CustomerBlockHandler;
import com.zpa.alibaba.service.Hello1Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author user
* 消费者使用
*/
@RestController
public class Consumer1Controller {
@Autowired
private Hello1Service hello1Service;
@GetMapping(value = "/hello")
@SentinelResource(value = "/helloConsumer",blockHandlerClass = CustomerBlockHandler.class,blockHandler="testblockHandler",
fallbackClass = CustomerFallback.class,fallback = "testFallback")
public String helloConsumer() {
return hello1Service.hello("我是一个服务消费者!!! ");
}
}
限流自处理类
package com.zpa.alibaba.blockHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
/**
* @Author user
* 流控规则。访问太快了
* 限流自定义处理优化出里
*/
public class CustomerBlockHandler {
//降级逻辑(备选逻辑),BlockException参数必须写
//方法定义为静态方法
public static String testblockHandler(BlockException exception){
return "有流控规则限流了,访问过快了,慢点点。。。";
}
}
服务降级自处理类
package com.zpa.alibaba.fallback;
/**
* <p>title: com.wfx.fallback</p>
* <p>Company: wendao</p>
* author zhuximing
* date 2020/10/29
* description:服务熔断降级异常自定义处理
*/
public class CustomerFallback {
//降级逻辑(备选逻辑),BlockException参数必须写
//方法定义为静态方法
public static String testFallback(Throwable throwable) throws Exception{
return "服务提供有问题,已经降级了,耐性等待一会。。。 ";
}
}