SpringCloud趁热总结--服务中心Eureka

先写实现,再添概念
设计了两个服务:用户服务和博客服务
用户服务:实现极其简单的注册和登陆功能
博客服务:实现极其简单的获取博客列表功能,暂时还没有发布功能,数据库里的数据是假滴
用博客服务远程调用用户服务,实现根据用户名查询博客列表功能

技术:
创建服务中心,让两个服务都注册到用户中心,然后通过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看太久了,应该快点往下看了,嘤嘤嘤。。。

猜你喜欢

转载自blog.csdn.net/Lqq77s/article/details/85068023