-
安装注册中心nacos。使用
startup.cmd -m standalone
可以不以集群方式启动,此时不需要配置conf文件。nacos默认端口8848,默认服务管理平台登录账号和密码都是nacos(服务起起来后进入localhost:8848) -
新建maven的父工程project,在父工程的pom文件中导入springboot的parent依赖与springcloud的依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> <relativePath/> </parent> <dependencyManagement> <dependencies> <!-- springCloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--nacos的管理依赖--> <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> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--lomboc--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
-
编写feign-api模块。feign的接口规范。
-
新建模块feign-api,编写pom文件,继承父工程依赖并导入feign的依赖
<parent> <artifactId>mycloud</artifactId> <groupId>com.lin</groupId> <version>1.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
-
编写远程调用接口(类似于springmvc里的Controller)和一些实体类pojo
//Feign的远程调用接口 @FeignClient(value = "userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
//实体类 @Data public class User { private Long id; private String username; private String address; }
-
用maven打包该feign-api模块,在后面的模块中需要导入该依赖
-
-
编写生产者模块
-
新建user-service模块,编写pom文件,继承父工程依赖并导入nacos客户端依赖、nacos配置管理依赖
<parent> <artifactId>mycloud</artifactId> <groupId>com.lin</groupId> <version>1.0</version> </parent> <!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--nacos的配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
编写springboot的配置文件bootstrap.yml(此文件优先于application.yml文件加载),在里面配置该服务的名字以及nacos注册中心与配置中心信息
spring: application: name: userservice cloud: nacos: server-addr: 127.0.0.1:8848 # nacos地址 #配置中心 config: file-extension: yaml # 文件后缀名
-
编写springboot的配置文件application.yml
server: #同一台机器上用不同服务端口来区分不同服务,防止端口冲突 port: 8081 spring: #数据源基本配置 datasource: url: jdbc:mysql://127.0.0.1:3306/cloud_user?useSSL=false&characterEncoding=UTF-8& zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
-
编写代码(与之前springboot开放没有什么区别)
-
-
编写消费者模块
-
新建order-service模块,编写pom文件,继承父工程依赖并导入nacos依赖、feign客户端依赖、HttpClient依赖(这里不使用feign里的默认http客户端)、和之前编写的feign的接口依赖,这里就不需要导入ribbon了,因为feign底层本来就是使用ribbon做负载均衡
<!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--nacos的配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--feign客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--引入HttpClient依赖--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency> <!--引入feign的统一api--> <dependency> <groupId>com.lin.mycloud</groupId> <artifactId>feign-api</artifactId> <version>1.0</version> </dependency>
-
编写springboot的配置文件bootstrap.yml(此文件优先于application.yml文件加载),在里面配置该服务的名字以及nacos注册中心与配置中心信息
spring: application: name: orderservice cloud: nacos: server-addr: 127.0.0.1:8848 # nacos地址 #配置中心 config: file-extension: yaml # 文件后缀名
-
编写springboot的配置文件application.yml
server: #同一台机器上用不同服务端口来区分不同服务,防止端口冲突 port: 8082 spring: #数据源基本配置 datasource: url: jdbc:mysql://127.0.0.1:3306/cloud_order?useSSL=false&characterEncoding=UTF-8& zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver ribbon: #开启ribbon的饥饿加载 eager-load: enabled: true # 开启饥饿加载 clients: # 指定饥饿加载的服务名称 - userservice feign: #开启HttpClient httpclient: enabled: true # 支持HttpClient的开关 max-connections: 200 # 最大连接数 max-connections-per-route: 50 # 单个路径的最大连接数 userservice: #设置userservice的远程调用配置 ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
-
编写代码(大部分与之前springboot开放没有什么区别),在需要使用feign远程调用时在该类用spring注入UserClient(这个在之前的feign-api里编写了),并调用该userClient
@Autowired private UserClient userClient; //以下在方法体中,演示如何进行远程调用 User user = userClient.findById(order.getUserId());
-
在主启动类上加上
@EnableFeignClients
注解开启Feign客户端@SpringBootApplication @EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class) public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
-
-
编写网关模块
-
新建gateway模块,编写pom文件,继承父工程依赖并导入nacos依赖与gateway网关依赖
<parent> <artifactId>mycloud</artifactId> <groupId>com.lin</groupId> <version>1.0</version> </parent> <!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--网关gateway依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
编写springboot的配置文件application.yml
server: port: 8080 spring: application: name: gateway cloud: nacos: server-addr: 127.0.0.1:8848 # nacos地址 gateway: routes: - id: user-service # 路由标示,必须唯一 uri: lb://userservice # 路由的目标地址 predicates: # 路由断言,判断请求是否符合规则 - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合 - id: order-service uri: lb://orderservice predicates: - Path=/order/** #default-filters: #使用默认过滤器 #- AddRequestHeader=xxx
-
配置全局过滤器,编写类实现
GlobalFilter
接口,并在该类上加入@Component
使其成为spring容器管理的bean,该过滤器类有两种设置过滤器链中权重的方式,其一是在该类上加入@Order(权重值)
注解;或是使该类实现Ordered
接口,并实现其中的getOrder()
方法配置权重@Component public class AuthorizeFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 1.获取请求参数 ServerHttpRequest request = exchange.getRequest(); MultiValueMap<String, String> params = request.getQueryParams(); // 2.获取参数中的 user 参数 String username = params.getFirst("user"); // 3.判断参数值是否等于 admin if ("admin".equals(username)) { // 4.是,放行 return chain.filter(exchange); } // 5.否,拦截 // 5.1.设置状态码 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); // 5.2.拦截请求 return exchange.getResponse().setComplete(); } @Override public int getOrder() { return -1; } }
-
-
若是不想使用nacos注册中心而是使用eureka,则需要新建一个eureka模块,并对上面进行一些修改
-
新建eureka-server模块,编写pom文件,继承父工程依赖并导入eureka依赖
<parent> <artifactId>mycloud</artifactId> <groupId>com.lin</groupId> <version>1.0</version> </parent> <!--eureka服务端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
编写springboot的配置文件application.yml
server: port: 8848 # 服务端口 spring: application: name: eurekaserver # eureka的服务名称 eureka: client: service-url: # eureka的地址信息 defaultZone: http://127.0.0.1:8848/eureka
-
将上面代码中所以的nacos依赖与配置全部换成eureka的依赖与配置(父项目中的nacos依赖也需要去掉)
<!--eureka客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
eureka: client: service-url: # eureka的地址信息 defaultZone: http://127.0.0.1:8848/eureka
-
springcloud入门案例(使用nacos/eureka、feign、ribbon、gateway组件)
于 2022-11-24 09:40:54 首次发布