4.3 分布式组件-SpringCloud-OpenFeign的使用步骤P22
1、背景
想要获取当前会员领取到的所有优惠券。先去注册中心找优惠券服务,
注册中心调一台优惠券服务器给会员,会员服务器发送请求给这台优
惠券服务器,然后对方响应。
Feign与注册中心
spring cloud feign
声明式远程调用
feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。
给远程服务发的是HTTP请求。
会员服务想要远程调用优惠券服务,只需要给会员服务里引入
openfeign依赖,他就有了远程调用其他服务的能力。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、整体流程
/**
* 1、A想要远程调用B服务
* 1) A引入open-feign
* 2)A编写一个接口CouponFeignService,告诉springcould这个接口需要调用远程服务
* 3)接口CouponFeignService 里的方法要声明调用哪个服务的哪个方法(B服务的 public R *
* membercoupons();)
* 4)开启远程调用功能
*/
@EnableFeignClients(basePackages = "com.atguigu.gulimail.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimailMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimailMemberApplication.class, args);
}
}
3、写好A要调用B的方法
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@RequestMapping("/member/list")
public R membercoupons() { //全系统的所有返回都返回R
CouponEntity couponEntity = new CouponEntity(); // 应该去数据库查用户对于的优惠券,但这个我们简化了,不去数据库查了,构造了一个优惠券给他返回
couponEntity.setCouponName("满100减30"); //优惠券的名字
return R.ok().put("coupons", Arrays.asList(couponEntity));
}
这样就准备好了优惠券的调用内容
4、A编写接口CouponFeignService
@FeignClient("gulimail-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list") 告诉spring cloud这个接口是一个远程客户端,要调用coupon服务,再去调用coupon服务/coupon/coupon/member/list对应的方法
public R membercoupons(); //全系统的所有返回都返回R
}
5、在A的application里开启远程调用
@EnableFeignClients(basePackages = "com.atguigu.gulimail.member.feign") //指定远程调用扫描的路径
@EnableDiscoveryClient
@SpringBootApplication
public class GulimailMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimailMemberApplication.class, args);
}
}
6、写一个Test去测试远程调用
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
R membercoupons = couponFeignService.membercoupons(); //假设张三去数据库查了后返回了张三的优惠券信息
// 打印会员和优惠券信息
return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons"));
}
7、重启服务,进行http调用
4.4 nacos配置中心的使用
1、背景
可以用nacos作为配置中心。配置中心的意思是不在application.properties,而是放到nacos配置中心公用,这样无需每台机器都改。
2、步骤1
1 引入配置中心依赖,放到common中
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3、编写配置文件
在coupons项目中创建/src/main/resources/bootstrap.properties ,这个文件是
springboot里规定的,他优先级别application.properties高
# 改名字,对应nacos里的配置文件名
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=192.168.11.1:8848
4、配置中心配置
在配置中心添加一个data id,gulimail-coupon.properties 默认名称:应用名.properties
添加配置:coupon.user.name = hu
coupon.user.age = 22
配置中心优先级比应用内的配置文件优先级更高
4、编写一个测试接口
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")//从application.properties中获取//不要写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);
}
}
4.5 nacos namespace命名空间
nacos namespace配置隔离
默认space:public(保留空间)
nacos里创建dev,test,prod用命名空间做配置隔离
bootstrap.properties里指定用哪个命名空间
spring.cloud.nacos.config.namespace=4d49f70d-1378-4e26-acfe-8d1778dc333b #要写id
微服务之间隔离
nacos里创建coupon、member命名空间
bootstrap.properties里指定用哪个命名空间
spring.cloud.nacos.config.namespace=9622c17d-2d35-4af3-af93-292499667ea8 #要写id
配置集:一组相关或不相关配置项的集合。
配置集ID:类似于配置文件名,即Data ID
配置分组:默认所有的配置集都属于DEFAULT_GROUP。自己可以创建分组,比如双十一,618,双十二
spring.cloud.nacos.config.group=DEFAULT_GROUP # 更改配置分组
最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)
加载多配置集
我们要把原来application.yml里的内容都分文件抽离出去。我们在nacos里创建好
后,在coupons里指定要导入的配置即可。
bootstrap.properties
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=192.168.11.1:8848
spring.cloud.nacos.config.namespace=ed042b3b-b7f3-4734-bdcb-0c516cb357d7 # # 可以选择对应的命名空间 ,即写上对应环境的命名空间ID
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
datasource.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.103:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
mybatis.yml
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
other.yml
spring:
application:
name: gulimall-coupon
cloud:
nacos:
discovery:
server-addr: 192.168.11.1:8848
server:
port: 7000