2Ribbon服务提供者 · SpringCloud微服务实战 · 看云

导航


本节代码地址


本节将通过一个简单的程序展示Ribbon API 的使用,本节的程序结构图如下:
6e47e21dee6933c5c5f2dce9a0e73862_MD5.webp

先建服务端fw-cloud-ribbon-server提供一个RESTFUL的接口,然后在创建Ribbon客户端调动,并将负载的效果显示出来。接下来开始

1. ribbon服务端模块

新建模块fw-cloud-ribbon-server
4fa756e02e435b9694641a856a7509e8_MD5.webp

1.1 maven 包引入

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

spring-boot-starter-actuator包不清楚的可以看下,前面章节“Eureka服务端健康检查”,使用spring-cloud-starter-netflix-eureka-client是想通过用Eureka的注册中心发现注册的服务列表。

1.2 新建启动类


@EnableDiscoveryClient
@SpringBootApplication
public class FwRibbonServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(FwRibbonServerApplication.class, args);
    }
}

1.3 添加配置

server:
  port: 8773
spring:
  application:
    name: fw-cloud-ribbon-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

这里为了更好的演示RESTFUL接口,我创建了一个User类

1.4 新建实体


@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    
    private long id;

    
    private String username;

    
    private String realname;

    
    private String email;

    
    private String remark;
}

1.5 新建Service 接口


public interface UserService {

    
    List<User> getUsers();

    
    User getUserById(long id);
}

1.6 新建 UserServiceImpl 实现类

这里我模拟了数据库构造数据,同时使用了java8 新特性lambda表达式查询用户信息,想要熟悉更多的java8 特性,可以看一本“Java 8 实战”的书。


@Service
public class UserServiceImpl implements UserService {

    @Override
    public List<User> getUsers() {
        return initUser();
    }

    @Override
    public User getUserById(long id) {
        List<User> userList = getUsers().stream().filter(user -> user.getId() == id).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(userList)){
            return new User(0,null,null,null,"这位顾客先拿一下腰牌!");
        }
        return userList.get(0);
    }

    
    private List<User> initUser(){

        List<User> userList =new ArrayList<>();
        User user1=new User(1,"113445","刘备","liubei@gmail.com","汉室刘皇叔,蜀国大佬");
        User user2=new User(2,"123456","关羽","guanyu@gmail.com","人称关二爷,蜀国五虎上将");
        User user3=new User(3,"147258","张飞","zhangfei@gmail.com","此人性格暴躁,蜀国五虎上将");

        userList.add(user1);
        userList.add(user2);
        userList.add(user3);

        return  userList;
    }
}

1.7 接下来编写RESTFUL 接口

这里我们增加了一个log日志,我们将当前提供服务的是url地址打印出来,这样方便我们看到演示效果。


@RestController
@RequestMapping("user")
public class RibbonController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id:\\d+}")
    public User getUserById(@PathVariable Long id, HttpServletRequest req){
        String url = req.getRequestURL().toString();
        User user = userService.getUserById(id);
        user.setRemark(user.getRemark()+":提供服务的是:"+url);
        return user;
    }

}

接下来我们需要启动项目验证RESTFUL 接口

1.8 启动项目

启动之前记得先启动Eureka服务端
通过postman 验证没问题
2e0f06e0e3c32c6017f6eddc305bab56_MD5.png

下面我们启动8774 端口的服务,跟之前一样,我们需要修改一下配置,允许并行启动
0e50ecd3443602096f66247523f0b547_MD5.png

然后修改端口为8774之后再启动

server:
  port: 8774

全部启动成功
412de5e9fec81efa495a9a702947b0dc_MD5.png

2.总结

本节我们了解了Ribbon 的请求结构及服务端的搭建,下面我们再创建Ribbon客户端,看看Ribbon 客户端如何跟服务端发生亲密的接触。