版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44190665/article/details/121043585
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44190665/article/details/121043585
我是看这位博主的文章 记录一下自己的实践过程
1、分布式组件
父工程引入依赖(已完成)
spring boot === 2.1.8.RELEASE
spring cloud ==== Greenwich.SR3
spring cloud alibaba ==== 2.1.0.RELEASE
1、nacos用作服务注册中心
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境
1、nacos下载安装
下载地址: https://github.com/alibaba/nacos/releases
解压安装包,直接运行bin目录下的startup.cmd
打开安装目录
cmd中输入命令startup.cmd -m standalone, 以单机模式启动(开发测试阶段用这个, 所以现在用这个)
或者修改startup.cmd文件中的set MODE=“standalone”, 然后就可以双击这文件启动nacos了
另外cmd中输入命令startup.cmd -m cluster是以集群模式启动,这个模式需要创建数据库, 详情网上找教程
访问 http://localhost:8848/nacos/
使用默认的账号密码都是nacos
2、使用nacos
1、yaml文件添加nacos配置信息
在项目里properties里或者yaml文件 写
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
(yaml同理,指定nacos的地址)。
再指定spring.applicatin.name告诉注册到nacos中以什么命名
2、引入依赖(放入common中)
<!-- Nacos服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
记得加一个版本管理
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
每次更新gulimall-common记得clean和install一下
在主启动类上使用 @EnableDiscoveryClient
注解开启服务注册与发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class, args);
}
}
3、启动gulimall-coupon, 查看服务注册中心
4、按照以上步骤依次给member/order/product/ware配置
2、openfegin远程调用
声明式远程调用
feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求。
会员服务想要远程调用优惠券服务,只需要给会员服务里引入openfeign依赖,他就有了远程调用其他服务的能力。
1、引入依赖
在微服务模块加入依赖
注意(如果该模块不需要调用别的模块的服务,则不需要使用openfeign, 也就不需要导入该依赖)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、演示member服务调用coupon服务
1、在被调用方 gulimall-coupon中的CouponController中添加调用方法
@RequestMapping("/member/list")
public R membercoupons(){ //全系统的所有返回都返回R
// 模拟去数据库查用户对于的优惠券
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100-10");//优惠券的名字
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
2、调用方 加上注解@EnableFeignClients
在主启动类 加上注解@EnableFeignClients
告诉member是一个远程调用客户端,member要调用东西的
在 EnableFeignClients 注解的 basePackages 属性中定义了一个 io.zdd.gulimall.member.feign 的包名,
这个注解就会告诉 OpenFeign 在启动项目的时候,找到所有位于 io.zdd.gulimall.member.feign包路径(包括子 package)之下使用 FeignClient 修饰的接口,
然后生成相关的代理类并添加到 Spring 的上下文中。这样一来,才能够在项目中用 Autowired 注解注入 OpenFeign 接口。
package io.zdd.gulimall.member.feign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients(basePackages = "io.zdd.gulimall.member.feign")//开启Feign客户端,加上类所在的包扫描
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
3、调用方 新建接口 CouponFeignService
gulimall-member想要远程调用gulimall-coupon服务中的信息,编写一个接口,告诉SpringCloud这个接口需要调用远程服务(创建一个feign文件夹,并且创建对应的feign接口),注意:该接口中的方法是来自被调用服务中信息的方法,并且@RequestMapping中对应的路径一定要写全,声明接口中的 每一个方法都是调用哪个远程服务的那个请求
package io.zdd.gulimall.member.feign;
import com.zdd.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("gulimall-coupon")//告诉spring cloud这个接口是一个远程客户端,要调用coupon服务(nacos中找到)
public interface CouponFeignService {
// 远程服务的url
@RequestMapping("/coupon/coupon/member/list")//注意写全优惠券类上还有映射
public R membercoupons();//得到一个R对象
}
4、调用方 的MemberController写一个测试
在gulimall-member服务中编写一个请求调用gulimall-coupon服务中的方法信息,下面的测试会返回两个信息,一个是gulimall-member服务本地的信息,另外一个是调用gulimall-coupon服务中的信息从而得到的信息
@Autowired
private CouponFeignService couponFeignService; //注入刚才的CouponFeignService接口
@RequestMapping("/coupons")
public R coupons(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("会员昵称张三");
R membercoupons = couponFeignService.membercoupons();
return R.ok().put("member", memberEntity).put("coupons", membercoupons.get("coupons"));
}
5、测试
启动gulimall-member,gulimall-coupon项目。
访问localhost:8000/member/member/coupons测试
成功啦~~~(~ ̄▽ ̄)~
3、nacos用作配置中心
1、common中添加依赖
nacos配置中心
<!-- nacos配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、在coupons项目中创建bootstrap.yml
/src/main/resources/bootstrap.yml,
application.properties 文件 优先级别 > yml 文件 配置信息
# 改名字,对应nacos里的配置文件名
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml # 指定配置文件为yaml格式
3、nacos添加配置
浏览器去nacos里的配置列表,点击+号,data ID:gulimall-coupon.yaml
,配置
4、在controller中编写测试代码
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private int age;
@RequestMapping("/nacos")
public R nacos(){
return R.ok().put("name", name).put("age", age);
}
5、访问http://localhost:7000/coupon/coupon/nacos测试
6、在coupon的控制层上加@RefreshScope
支持动态刷新
7、新建coupon、member、order、product、ware五个命名空间分别保存自己的配置文件
nacos说明:
最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)
我在 7 这个步骤 暂时还没有使用 后续有需要再执行吧
4、网关gateway-88
1、新建gulimall-gateway网关模块
网关模块项目,引入依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>com.zdd.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- Maven整个生命周期内排除内置容器,排除内置容器导出成war包可以让外部容器运行spring-boot项目-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2、nacos 浏览器 配置信息
在nacos上新建gateway命名空间,在命名空间中新建配置gulimall-gateway.yaml
3、nacos 服务注册发现
配置application.yml
server:
port: 88
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-gateway
4、nacos 配置信息
配置bootstrap.yml
spring:
application:
name: gulimall-gateway
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace:
(注:从网上搜到的资料中 ,这个namespace 都是有值的 ,但是,我还不清楚 这个值的value是从哪里来的 我先给空着了 有了解的友友 麻烦告诉我一下 谢谢啦~ )
4、主启动类
package com.atguigu.gulimall;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 1、开启服务注册发现
* (配置nacos的注册中心地址)
* 2、编写网关配置文件
*/
@EnableDiscoveryClient
// 网关服务不需要数据库的配置,这里排除数据库的配置,不排除引入common依赖会报错
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
5、测试
测试访问http://localhost:88?url=baidu 切换到百度, http://localhost:88?url=qq 切换到qq
在网关的application.yml中配置路由
server:
port: 88
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: baidu_route # 每一个路由的名字,唯一即可
uri: https://www.baidu.com # 匹配后提供服务的路由地址
predicates: # 断言规则
- Query=url,baidu #如果url参数等于baidu 符合断言,转到uri
- id: qq_route # 每一个路由的名字,唯一即可
uri: https://www.qq.com # 匹配后提供服务的路由地址
predicates: # 断言规则
- Query=url,qq #如果url参数等于baidu 符合断言,转到uri
application:
name: gulimall-gateway
启动网关,访问http://localhost:88?url=baidu测试,成功!
注:有关详细gateway资料 可以查看下面这位博主的原创文章 感谢
(版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a745233700/article/details/122917167)
未完待续~