唠嗑:今天接着昨天的继续,今天自己搭的时候还是遇到了一些问题,写完会总结一下。
一、服务之间通信
1.通过Ribbon实现
在启动类中定义RestTemplate,使用@LoadBalanced开启负载均衡,Nacos默认整合了Ribbon。
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
在springcloudalibaba-user-server定义一个接口,供其他服务调用
在springcloudalibaba-order-server定义一个接口,调用/user这个接口
@RestController
public class UserController {
@Autowired
private IUserService userService;
@GetMapping("/user/{id}")
public User getById(@PathVariable Long id){
//这里可以先用假数据代码代替从数据库查出来的数据,后面会配置连接mysql和集成mybatis-plus。
User id1 = userService.getOne(new QueryWrapper<User>().eq("id", id));
return id1;
}
}
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
/**
* 通过Ribbon进行服务通信
* @param id
* @return
*/
@RequestMapping("/order1/{id}")
public User getById(@PathVariable Long id){
String url = "http://user-server/user/"+id;
return restTemplate.getForObject(url,User.class);
}
}
通过访问http://localhost:1020/order1/1 获取到User数据
2.通过feign
2.1在order-server中引入依赖
<!--feign依赖包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2创建一个接口类,存放需要调用的对方服务接口
@FeignClient("user-server") //目标服务名
public interface UserClient {
//和UserController保持一致
@GetMapping("/user/{id}")
User getById(@PathVariable (value="id") Long id);
}
注意@PathVariable (value="id") value不能少,不然要报错。
然后再启动类上开启feign支持
@EnableFeignClients("cn.huangsong.feignclient")
@SpringBootApplication
//@EnableDiscoveryClient注解开启服务发现功能
@EnableDiscoveryClient
//开启Feign支持
@EnableFeignClients("cn.huangsong.feignclient") //扫描接口类包
public class OrgerServerApplication1020 {
public static void main(String[] args) {
SpringApplication.run(OrgerServerApplication1020.class);
}
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
写个测试接口调用user-sever服务
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private UserClient userClient ;
/**
* 通过Ribbon进行服务通信
* @param id
* @return
*/
@RequestMapping("/order1/{id}")
public User getById(@PathVariable Long id){
String url = "http://user-server/user/"+id;
return restTemplate.getForObject(url,User.class);
}
/**
* 通过feign进行服务通信 熔断降级暂时没学到那里去。
* @param id
* @return
*/
@RequestMapping("/order2/{id}")
public User getUserById(@PathVariable Long id){
return userClient.getById(id);
}
}
通过访问http://localhost:1020/order2/3获取到User数据
二、nacos配置中心
点击+新增配置文件
我这里的配置——>代替了项目中的application.yml
项目中操作:把application.yml改成bootstrap.yml
大概的一个流程:cloud项目启动:加载bootstrap.yml配置,根据里面的nacos地址找到配置中心的配置文件
在加载配置中心的配置文件启动项目
在user-server导入需要的报
<!--配置中心依赖包-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
在common导入需要的包 引入持久层框架Mybatis-plus
<!--mybatis-plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
创建一张表,生成对应的实体类User
@AllArgsConstructor
@Data
@NoArgsConstructor
@TableName("t_user") //表名
public class User implements Serializable{
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String password;
private String permission;
}
bootstrap.yml配置
spring:
profiles:
active: dev
application:
name: user-server #服务名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: localhost:8848 #配置中心
file-extension: yaml #配置文件格式
prefix: application-user #配置前缀 ,默认使用sring.application.name
group: DEFAULT_GROUP #默认分组
#namespace: 123456 #命名空间的ID->访问命名空间的配置
#如何查找配置文件:application-user + dev + yaml=application-user-dev.yaml 正好和Nacos配置的DataId一致
提示:客户端是如何从Nacos中找到配置文件的呢?
spring.cloud.nacos.config.server-addr :配置了Nacos的地址
spring.cloud.nacos.config.file-extension:指定了配置文件的格式为YAML,默认是properties,
spring.cloud.nacos.config.prefix:配置前缀,如果不配置前缀默认会把 服务名即spring.application.name的值作为前缀
spring.cloud.nacos.config.group :分组名,默认是DEFAULT_GROUP对应了Nacos配置中的Group
spring.profiles.active:配置了环境为dev .该配置可以实现多配置多环境管理
根据如上配置,那么config客户端会将:前缀+环境+后缀 拼接成的文件名“application-user-dev.yaml” 去Nacos上查找是否有对应Data ID的配置文件。
启动成功图 端口号是nacos上配置文件中的1030
order-server加载的是项目中的application.yml文件,user-server加载的是nacos上的配置文件
user-server和order-server配置文件内容
还有一个命名空间这里就不写了,查一下资料就明白了。
易错点:
1.需要加载nacos上的配置文件要把application.yml改成bootstrap.yml
2.引入了持久层框架不要忘记扫描mapper包。启动类上@MapperScan("cn.huangsong.mapper")
3.最重要nacos上的配置文件格式层级一定要写对,不然你会找很久的错的。