微服务的拆分与编写

- 项目三板斧
- 依赖
- 注解
- 配置
@Data:次注解包含了Getter Setter RequiredArgsConstructor Tostring EqualsAndHshCode value
@RequiredArgsConstructor:为标记位final的参数生成构造方法
@Builder:
这里需要注意的是,有builer之前,我们这么写
UserRegisterDTO userRegisterDTO = new UserRegisterDTO();
userRegisterDTO.setEmail("dadasda");
userRegisterDTO.setConfirmPassword("ndksadksa");
userRegisterDTO.setPassword("dhajksdjk");
有了builder之后。我们这么写:建造者模式(feign)
UserRegisterDTO.builder()
.email("dahsjkda")
.confirmPassword("dnajksjkd")
.password("aksldkla")
.build();
@Slf4j
之前我们这么写:
public static final Logger LOGGER = (Logger) LoggerFactory.getLogger(LombokTest.class);
后来我们这么写
@Slf4j
log.info("dashkdsa")
注意:我们以后的实体类都可以加上
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
这四个注解
@autowired:会标红,
我们可以使用@RequiredArgsConstructor(onConstructor = @__(@Autowired))来替换,这时候就不会爆红了
连接
http://www.imooc.com/article/287865
- @resource和@autowired的区别:
@Resource的作用相当于@Autowired,
@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了;
@Resource是JDK自带的注解,而@Autowired是Spring提供的注解;
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
例如:@Resource可以指定名称@Resource(name=“XXX”)
@Autowired也可以按照名称进行匹配,但是比较麻烦,要和另外一个注解结合使用:@Autowired @Qualifier(“XXX”)
@Autowired注解是按类型匹配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
这两个注解可以作用在变量上,也可以作用在setter方法上
如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。 - @repository@component@service@controller区别和联系
@Component,@Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
@Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。 (数据库)的bean来使用
@Controller是spring-mvc的注解,具有将请求进行转发,重定向的功能。
@Service是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。 用这些注解对应用进行分层之后,就能将请求处理,业务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
## Schema First
1. 分析业务(流程图、用例图...架构图等等)--> 建模业务,并且确定架构
2. 敲定业务流程(评审)
3. 设计API(我需要哪些API呢)/数据模型(表结构设计|类图|ER图等等)
4. 编写API文档
5. 编写代码---
## API First
1. 分析业务(流程图、用例图...架构图等等)--> 建模业务,并且确定架构
2. 敲定业务流程(评审)
3. 设计API(我需要哪些API呢)/数据模型(表结构设计|类图|ER图等等)
4. 编写代码
5. 编写API文档---灵活运用
- 怎么调用用户微服务的/users/{userId}?
RestTemplate:
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
//用http的get方法请求,返回一个对象
String forObject = restTemplate.getForObject(
"http://localhost:8080/users/2",
String.class
);
System.out.println(forObject);
}
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
//用http的get方法请求,返回一个对象
String forObject = restTemplate.getForObject(
"http://localhost:8080/users/{id}",
String.class,
2
);
System.out.println(forObject);
}
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
//用http的get方法请求,返回一个对象
ResponseEntity<String> forEntity = restTemplate.getForEntity(
"http://localhost:8080/users/{id}",
String.class,
2
);
System.out.println(forEntity);
}
//可以获取状态码
System.out.println(forEntity.getStatusCode());
//在spring容器中,创建一个对象,类型RestTemplate,名称是restTemplate()
//<bean id = 'restTemplate' class = "xxx.RestTemplate"/>
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public class ShareService {
private final ShareMapper shareMapper;
private final RestTemplate restTemplate;
public ShareDTO findById(Integer id) {
Share share = this.shareMapper.selectByPrimaryKey(id);
//获取发布人的id
Integer userId = share.getUserId();
//怎么调用用户微服务的/users/{userId}?
UserDTO userDTO = this.restTemplate.getForObject(
"http://localhost:8080/users/{id}",
UserDTO.class,
userId
);
//消息的装配
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share, shareDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
- spring cloud alibaba
- 版本的兼容性

- 版本的兼容性
- 三板斧
- 依赖
<dependencyManagement>
<!-- 整合springcloud-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 整合springcloudalibaba-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.9.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 注解:无
- 配置:无
服务发现
- nacos
- 作用
- 服务发现组件,服务A怎么发现服务B
- 配置服务器
- 步骤
- nacos 配置好
- 在bin目录下运行 sh startup.sh -m standalone
- 浏览器访问 http://localhost:8848/nacos
- 将微服务器注册到微服务器(包括内容,用户中心)
- 测试一下:内容中心能找到用户中心
- 作用

- 项目三板斧
- 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 注解:无
- 配置
cloud:
nacos:
discovery:
server-addr: localhost:8848
application:
#服务名称尽量用-,
name: user-center
测试代码
/**
* @author DARKSIDEinxx
* @Param
* @return 用户中心所有实例的地址信息
* @throws
* @description 测试:服务发现,证明内容中心总能找到用户中心
* @updateTime 2022/4/18 21:39
*/
//springcloud提供的接口
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/test2")
public List<ServiceInstance> setDiscoveryClient() {
//查询指定服务的所有实例的指定信息
return this.discoveryClient.getInstances("user-center");
}

使用restTemplate实现微服务的调用:
restTemplate:
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
public class ShareService {
private final ShareMapper shareMapper;
private final RestTemplate restTemplate;
private final DiscoveryClient discoveryClient;
public ShareDTO findById(Integer id) {
Share share = this.shareMapper.selectByPrimaryKey(id);
//获取发布人的id
Integer userId = share.getUserId();
//拿到用户中心的所有实例信息
List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
String targetURL = instances.stream()
//数据变换
.map(instance -> instance.getUri().toString() + "/users/{id}")
.findFirst()
//当instance没有实例的时候,会走到下面的报错
.orElseThrow(() -> new IllegalArgumentException("当前没有实例"));
log.info("请求的目标地址是:{}", targetURL);
//怎么调用用户微服务的/users/{userId}?
UserDTO userDTO = this.restTemplate.getForObject(
targetURL,
UserDTO.class,
userId
);
//消息的装配
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share, shareDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
}
Namespace: 实现隔离
Group: 组0.9.0暂时还用不到
Service:微服务
Cluster:对指定微服务的一个虚拟划分,默认default
Instance:微服务实例
cloud:
nacos:
discovery:
server-addr: localhost:8848
#指定namespace
namespace: 96f205b9-7313-4ed4-984d-4b0cfc51b8ab
#指定集群名称
cluster-name: NJ



小D学习的视频是慕课网的大目老师讲解的springcloudAlibaba视频。
keep moving~
版权声明:本文为weixin_43772732原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。