先写实现,再添概念
设计了两个服务:用户服务和博客服务
用户服务:实现极其简单的注册和登陆功能
博客服务:实现极其简单的获取博客列表功能,暂时还没有发布功能,数据库里的数据是假滴
用博客服务远程调用用户服务,实现根据用户名查询博客列表功能
技术:
创建服务中心,让两个服务都注册到用户中心,然后通过feign实现远程调用
服务中心
服务中心的pom文件我就不贴了,需要注意的一点是springboot和springcloud版本要匹配,亲测Springboot 2.0.0.RELEASE与 SpringCloud Finchley.RELEASE匹配,jdk1.8,
引入的服务中心依赖为
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>
spring-cloud-starter-netflix-eureka-server
</artifactId>
</dependency>
还加了这一项
<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>
</dependencies>
</dependencyManagement>
服务中心配置
spring.application.name=eureka-server #服务名
server.port=8000 #服务端口
eureka.client.register-with-eureka=false #不将自己注册到服务中心
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/ #服务发现地址
服务中心启动类
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaApplication.class, args);
}
}
至此,服务中心就搭完了,我自己做的过程中发现比较坑的地方就是版本不匹配了,其他的还是没有什么问题的。
用户服务
为了快点看,这两个服务写的极其简单,也踩了坑,现在的是可以运行的版本
mybatis-generator反向生成类和mapper会单写,那个也挺坑
在编码之前必要的配置
pom.xml除了springcloud基本依赖以外,再添加euraka-client依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
所有依赖如下,包括mybatis-generator
application.properties,这里包括euraka和mysql配置
spring.application.name=blogs_viewer_content
server.port=8081
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
mybatis.mapper-locations=classpath*:mapping/*.xml
mybatis.type-aliases-package=com.springboot.learn.blogs_viewer.entity
jdbc.type=mysql
spring.datasource.url=jdbc:mysql://localhost:3306/blog_viewer_data?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
启动类上添加注解
@EnableDiscoveryClient
实体类
User.java
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
}
本地服务使用的LoginService和RegisterService先不写了,只是把数据查出来而已,其他功能等下次迭代再添加,主要写可被远程调用的接口FindUserService,提供通过用户id和用户名查找用户的功能
FindUserService.java
public interface FindUserService {
public User findById(int id);
public User findByName(String name);
}
FindUserServiceImpl.java
@Service
public class FindUserServiceImpl implements FindUserService {
@Autowired
private UserMapper dao;
public User findById(int id){
return dao.selectByPrimaryKey(id);
}
public User findByName(String name){
return dao.selectByUsername(name);
}
}
其实对其他服务可见的是Controller对外提供的接口,远端服务通过服务名和url访问Controller,这里需要注意的是@RequestParam注解的应用
@RestController
public class UserController {
@Autowired
private FindUserService service;
@RequestMapping("/findByUsername")
public String findByUsername(@RequestParam(value = "name") String name){
return JSON.toJSONString(service.findByName(name));
}
}
博客服务
博客服务中需要调用远端接口,根据用户名查询该用户的博客列表。
在编码之前有一些必要的配置
pom.xml,
相比用户服务,需要额外添加openfeign,这个jar的2.0.0版本与springboot2.0.0匹配
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
application.properties
spring.application.name=blogs_viewer_content
server.port=8081
mybatis.mapper-locations=classpath*:mapping/*.xml
mybatis.type-aliases-package=com.springboot.learn.blogs_viewer.entity
jdbc.type=mysql
spring.datasource.url=jdbc:mysql://localhost:3306/blog_viewer_data?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
启动类添加注解如下
@SpringBootApplication
@MapperScan("com.springcloud.learn.blog_viewer_content.mapper")
@EnableDiscoveryClient
@EnableFeignClients
设计和编码
因为在实体类Blog中,没有用户名字段,而是以用户id作为外键的author,因此,需要调用远端的用户服务,根据用户名获取User对象,再拿到userId,然后执行博客服务本地的service代码。
将这个流程拆解开,则需要两个Service,一个用来调远端,入参为name,返回值为Json格式的User,另一个用来调本地,入参为authorId,返回值为List list,并最终返回给前台。
调用远端的UserRemote
@Service
@FeignClient(name="blog-viewer") //配置远端服务名
public interface UserRemote {
@RequestMapping("/findByUsername") //配置远端服务对外开放的接口,即Controller的url
public String findByUsername(@RequestParam(value="name")String name); //配置匹配参数
}
将两者结合起来的MyBlogServiceImpl
@Service
public class MyBlogsServiceImpl implements MyBlogsService {
@Autowired
private BlogMapper dao;
@Autowired
private UserRemote userRemote;
@Override
public List<Blog> listMyBlogs(String name) {
User user = JSON.parseObject(userRemote.findByUsername(name),new TypeReference<User>(){})//获取的是Json,需要将其转换为User
List<Blog> myList = dao.listByAuthorId(user.getId());
return myList;
}
}
Controller
@RequestMapping("/myList")
public String myList(String name){
List<Blog> list = myService.listMyBlogs(name);
return JSON.toJSONString(list);
}
依次开启注册中心,用户服务和博客服务
用postman调博客服务
现在这些只是个记录,后续还会再添理论和过程,我的eureka看太久了,应该快点往下看了,嘤嘤嘤。。。