SpringCloud微服務大綱 02(idea篇)
阿新 • • 發佈:2018-12-05
Ribbon 呼叫
負載均衡演算法
- 輪循演算法
啟動兩個userService服務
- 注意:當無法同時執行兩個main方法的時候,如下操作
點選進入第一個選項
右上角把這裡的√全部取消掉之後點apply執行
設定兩個不同的埠
server:
port: 8881
server:
port: 8882
controller類中可以隨便新增一個方法測試
@GetMapping("/a")
public String a(){
return "1";
}
- 執行userview服務
在controller類中新增一個方法呼叫
@Autowired
RestTemplate rt;
@GetMapping("/a")
public String a(){
String url="http://USERSERVICE/a";
String forObject = rt.getForObject(url, String.class);
return forObject;
}
-
實現以下情況 ,輪流迴圈1和2
-
隨機演算法(RandomRule)
在userview的main方法的類中新增一個Bean
重新執行,即可去看效果
-
在這裡也可以自己定義一個rule類,按照自己的規則去定義
-
注意:建立一個在main方法子類或則同層級的類,否則無法掃描到,還有不要新增任何註解
需要extends AbstractLoadBalancerRule類,在實現重寫
public class MyRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object o) {
ILoadBalancer loadBalancer = this.getLoadBalancer();
List<Server> reachableServers =loadBalancer.getReachableServers();
return reachableServers.get(0);
}
}
簡單的實現了永遠執行第一臺服務service;快去試試自己 的規則吧!
- 注意:這樣定義的規則是針對所有人呼叫的,當微服務多的時候,或者呼叫其他微服務的時候,會出現一些問題
所以需要去yml配置中新增 —誰需要掉用就寫誰的
#微服務的名稱
USERSERVICE:
ribbon:
NFLoadBalancerRuleClassName: rule.MyRule
當如果都需要的時候就在main方法添加個bean
Feign呼叫
這裡在userservice中的controller層添加了一個類,取名就叫Empcontroller,這裡就用rest風格去實現
@RestController
public class EmpController {
@GetMapping("/emp/{id}")
//@PathVariable 獲取路勁引數
public Emp queryEmp(@PathVariable String id){
Emp emp=new Emp();
emp.setId(id);
emp.setName("張三******"+id);
return emp;
}
@PostMapping("/emp")
public Result add(@RequestBody Emp emp){
Result result=new Result();
result.setCode(1);
result.setMsg(emp.getId()+"----"+emp.getName());
return result;
}
@DeleteMapping("/emp/{id}")
public Result del(@PathVariable String id){
Result result=new Result();
result.setCode(1);
result.setMsg(id);
return result;
}
@PutMapping("/emp/{id}")
public Result update(@PathVariable String id,@RequestBody Emp emp){
Result result=new Result();
result.setCode(1);
result.setMsg("修改成功");
return result;
}
}
新建了一個新的微服務,entity 可以從上面複製,yml也直接複製就好,不需要改動
- 注意userviewF中需要多新增一個屬於Feign的註解@EnableFeignClients
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@RestController
public class UserViewF {
public static void main(String[] args) {
new SpringApplicationBuilder(UserViewF.class).web(true).run(args);
}
}
- 因為feign是面向介面程式設計,所以添加個介面類,注意註解@FeignClient(name=“連線的服務名”)
@FeignClient(name="USERSERVICE")
public interface EmpFeign {
@GetMapping("/emp/{id}")
//@PathVariable 獲取路勁引數
public Emp queryEmp(@PathVariable("id") String id);
@PostMapping("/emp")
public Result add(Emp emp);
@DeleteMapping("/emp/{id}")
public Result del(@PathVariable("id") String id);
@PutMapping("/emp/{id}")
public Result update(@PathVariable("id") String id,@RequestBody Emp emp);
}
@RestController
public class EmpController {
@Autowired
EmpFeign ef;
@GetMapping("/query")
public Emp queryEmp(){
String id="1";
Emp emp=ef.queryEmp(id);
return emp;
}
@GetMapping("/add")
public Result add(Emp emp){
Result add = ef.add(emp);
return add;
}
@GetMapping("/del")
public Result del(){
String id="1";
Result del = ef.del(id);
return del;
}
@GetMapping("/update")
public Result update(Emp emp){
String id="1";
Result del = ef.update(id,emp);
return del;
}
}
沒有連線資料庫,在url地址直接輸入測試