ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

谷粒商城(二)——组件选型

2021-09-12 19:29:51  阅读:247  来源: 互联网

标签:coupon spring 配置 nacos 选型 谷粒 组件 config cloud


接上篇:谷粒商城实战(一) 中,其他组件选型的内容:

注册中心(服务发现/注册): SpringCloud Alibaba - Nacos
配置中心(动态配置管理): SpringCloud Alibaba - Nacos
负载均衡: SpringCloud - Ribbon
声明式HTTP客户端(调用远程服务RPC?): SpringCloud - Feign
服务容错(限流、降级、熔断): SpringCloud Alibaba - Sentinel
API网关(webflux编程模式): SpringCloud - Gateway
调用链监控: SpringCloud - sleuth
分布式事务解决方案: SpringCloud Alibaba - Seata


推荐版本(避免兼容问题):

  • spring-boot-starter-parent: 2.2.5.RELEASE
  • spring-cloud-alibaba-dependencies: 2.2.0.RELEASE
  • spring-cloud.version: Hoxton.SR4

Nacos 作为注册中心

下载并启动 nacos:

wget https://github.com/alibaba/nacos/releases/download/2.0.3/nacos-server-2.0.3.tar.gz

tar -zxvf nacos-server-2.0.3.tar.gz

cd nacos/bin/

sh startup.sh -m standalone

在浏览器中访问:localhost:8848/nacos,user/password 都是 nacos

项目中引入 nacos 依赖
因为每个服务都需要依赖 nacos,所以在common包中引入依赖

  1. 定义spring-cloud-alibaba dependencyManagement进行版本管理(版本取决于springcloud/web的版本。
<dependencyManagement>
       <dependencies>
           <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>
  1. 引入nacos依赖
<!-- 服务注册中心+配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 在每个服务中定义nacos相关配置
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848	# nacos服务地址
  application:
    name: coupon	# 服务名

开启每个服务的注册
在每个服务的启动类上都标注:@EnableDiscoveryClient,就可以使服务被 nacos 发现

启动服务后,就可以在 nacos 上看到自己的服务了。

Feign 声明式远程调用

1、引入 openFeign

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、编写一个接口,告诉 springcloud 该接口需要调用远程服务(@FeignClient("coupon"))

@FeignClient("coupon")  // 声明该接口是一个声明式远程调用接口
public interface CouponFeignService {
    @RequestMapping("coupon/coupon/member/list")	// 全路径
    public R memberCoupons();
}

3、在 需要进行远程调用的 服务的入口处,添加注释@EnableFeignClients(basePackages="top.soultop.topmall.member.feign"),开启远程调用功能。

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "top.soultop.topmall.member.feign")
public class MemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(MemberApplication.class, args);
    }
}

Nacos 作为配置中心

1、引入 nacos-config 依赖

<!-- 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2、需要接入配置中心的服务,需要在resources/ 目录下创建一个 bootstrap.properties 文件,配置 nacos-config 相关内容

# nacos配置中心上配置的配置名(这里是用server name)
spring.cloud.nacos.config.name=coupon
# nacos service ip
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

nacos 支持定义命名空间,以此来实现不同命名空间之间配置的隔离。

3、在配置中心(nacos上)创建一个 serverName.properties,内容如下:

coupon.user.name=soultop
coupon.user.age=19

4、使用

@RefreshScope   // 每次都动态刷新scope(去配置中心取数)
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
	// 此时由于配置了命名空间,所以读取的是指定的命名空间中,相应配置的内容
    @Value("${coupon.user.name}")	// 解析配置文件中相应的配置
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;

    @RequestMapping("/test")
    public R test() {
        return R.ok().put("name", name).put("age", age);
    }
}

配置中心进阶

nacos中还可以配置:

  • 命名空间:用作配置隔离。(一般每个微服务一个命名空间)
    • 默认public。默认新增的配置都在public空间下
    • 可以按照:开发(dev)、测试(test)、生产(prod)为命名空间分割。
    • 在bootstrap.properties里配置命名空间(测试完去掉,学习不需要)
      # 可以选择对应的命名空间 # 写上对应环境的命名空间ID
      spring.cloud.nacos.config.namespace=b176a68a-6800-4648-833b-be10be8bab00
      
    • 也可以为每个微服务配置一个命名空间,微服务互相隔离
  • 配置集:一组相关或不相关配置项的集合。
  • 配置集ID:类似于配置文件名,即Data ID
  • 配置分组:默认所有的配置集都属于DEFAULT_GROUP。双十一,618的优惠策略改分组即可
    spring.cloud.nacos.config.group=1111	# 默认 DEFAULT_GROUP
    

最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)
在这里插入图片描述

# server name
spring.cloud.nacos.config.name=coupon
# nacos service ip
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 命名空间
spring.cloud.nacos.config.namespace=c12e0fb9-8c1b-4e0f-8f8b-6e21df28425b
# 分组
spring.cloud.nacos.config.group=dev

在bootstrap.properties中加载多配置集

我们要把原来application.yml里的内容都分文件抽离出去。我们在nacos里创建好后,在coupons里指定要导入的配置即可。

bootstrap.properties

在其中用数组 spring.cloud.nacos.config.extension-configs[] 写明每个配置集

spring.application.name=gulimall-coupon

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 可以选择对应的命名空间 # 写上对应环境的命名空间ID
spring.cloud.nacos.config.namespace=b176a68a-6800-4648-833b-be10be8bab00
# 更改配置分组
spring.cloud.nacos.config.group=dev

#新版本不建议用下面的了
#spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
#spring.cloud.nacos.config.ext-config[0].group=dev
#spring.cloud.nacos.config.ext-config[0].refresh=true
#spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
#spring.cloud.nacos.config.ext-config[1].group=dev
#spring.cloud.nacos.config.ext-config[1].refresh=true
#spring.cloud.nacos.config.ext-config[2].data-id=other.yml
#spring.cloud.nacos.config.ext-config[2].group=dev
#spring.cloud.nacos.config.ext-config[2].refresh=true

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

Gateway 网关

网关作为流量入口,常用功能包括路由转发、权限校验、限流控制等。springcloud gateway取代了zuul网关。

https://spring.io/projects/spring-cloud-gateway

参考手册:https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/

三大核心概念:

  • Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates断言, and a collection of filters. A route is matched if the aggregate predicate is true.发一个请求给网关,网关要将请求路由到指定的服务。路由有id,目的地uri,断言的集合,匹配了断言就能到达指定位置,
  • Predicate断言: This is a Java 8 Function Predicate. The input type is a Spring Framework ServerWebExchange. This lets you match on anything from the HTTP request, such as headers or parameters.就是java里的断言函数,匹配请求里的任何信息,包括请求头等。根据请求头路由哪个服务
  • Filter: These are instances of Spring Framework GatewayFilter that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.过滤器请求和响应都可以被修改。

使用

1、使用spring-Initializer 新建 gateway 服务,并引入gateway
2、将服务注册到 nacos

  • 配置注册中心
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    spring.application.name=gateway
    server.port=88	# 服务运行端口
    
  • 入口处:@EnableDiscoveryClient

3、程序启动时会发由于没有配置 sql 数据源 url 报错,因为引入的 common 包中包含有 mybatis 依赖,这其中需要配置 sqlurl,将他 exclude 出去就行。如:

  • @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
  • 或直接,在 pom 文件中 exclude 掉

4、配置nacos配置中心

标签:coupon,spring,配置,nacos,选型,谷粒,组件,config,cloud
来源: https://blog.csdn.net/weixin_43869778/article/details/120249070

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有