结合 SpringCloud Alibaba 我们最终的技术搭配方案:
引入依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.6.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
在common模块
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
下载Nacos Server:https://github.com/alibaba/nacos/releases
在 application.properties 中配置 Nacos server 的地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
package com.jq.gulimall.coupon;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@MapperScan("com.jq.gulimall.coupon.dao")
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class, args);
}
}
单击启动Nacos
startup.cmd -m standalone
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
/src/main/resources/bootstrap.properties
gulimall-coupon:当前服务的名字
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
在对应controller上面添加注解,接口动态刷新修改完配置的文件
@RefreshScope //动态获取,并刷新配置
@Value("${配置项的名,例如user.name}") //获取application.properties中的值
优先使用Nacos配置中心的配置
用于进行租户粒度的配置隔离。 不同的命名空间下, 可以存在相同的 Group 或 Data ID 的配置。 Namespace 的常用场景之一是不同环境的配置的区分隔离,
例如
spring.cloud.nacos.config.namespace=spring.cloud.nacos.config.namespace=(命名空间的唯一id值,看下图)
一组相关或者不相关的配置项的集合称为配置集。 在系统中, 一个配置文件通常就是一个配置集, 包含了系统各个方面的配置。
例如, 一个配置集可能包含了数据源、 线程池、 日志级别等配置项
Nacos 中的某个配置集的 ID。 配置集 ID 是组织划分配置的维度之一。
Data ID 通常用于组织划分系统的配置集。 一个系统或者应用可以包含多个配置集, 每个配置集都可以被一个有意义的名称标识。
Data ID 通常采用类 Java 包( 如com.taobao.tc.refund.log.level) 的命名规则保证全局唯一性。 此命名规则非强制
Nacos 中的一组配置集, 是组织配置的维度之一。 通过一个有意义的字符串( 如 Buy 或Trade ) 对配置集进行分组, 从而区分 Data ID 相同的配置集。
当您在 Nacos 上创建一个配置时, 如果未填写配置分组的名称, 则配置分组的名称默认采用 DEFAULT_GROUP。 配置分组的常见场景: 不同的应用或组件使用了相同的配置类型, 如 database_url 配置和MQ_topic 配置
在bootstrap.properties进行配置
spring.cloud.nacos.config.group= 设置的Group名称
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=a7f396db-27e4-49c0-8cf6-1b79b486886f
#spring.cloud.nacos.config.group=prod
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true
spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true
Feign 是一个声明式的 HTTP 客户端, 它的目的就是让远程调用更加简单。 Feign 提供了 HTTP
请求的模板, 通过编写简单的接口和插入注解, 就可以定义好 HTTP 请求的参数、 格式、 地
址等信息。
Feign 整合了 Ribbon(负载均衡) 和 Hystrix(服务熔断), 可以让我们不再需要显式地使用这
两个组件。
SpringCloudFeign 在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持, 在其实现下, 我
们只需创建一个接口并用注解的方式来配置它, 即可完成对服务提供方的接口绑定。 简化了
SpringCloudRibbon 自行封装服务调用客户端的开发量。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
package com.jq.gulimall.member.feign;
import com.jq.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
开启远程调用功能,启动类上加@EnableFeignClients
注解
package com.jq.gulimall.member;
import org.mybatis.spring.annotation.MapperScan;
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(basePackages ="com.jq.gulimall.member.feign")
@EnableDiscoveryClient
@MapperScan("com.jq.gulimall.member.dao")
@SpringBootApplication
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
网关作为流量的入口, 常用功能包括路由转发、权限校验、限流控制等。而 springcloud gateway作为 SpringCloud 官方推出的第二代网关框架, 取代了 Zuul 网关。
API 网关出现的原因是微服务架构的出现, 不同的微服务一般会有不同的网络地址, 而外部
客户端可能需要调用多个服务的接口才能完成一个业务需求, 如果让客户端直接与各个微服
务通信, 会有以下的问题:
package com.jq.gulimall.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
spring.application.name=gulimall-gateway
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
server.port=88
spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=071b81ba-f206-496b-9db2-2c29ba77190e